Обновить измененную DataGrid в базу данных? - PullRequest
2 голосов
/ 31 января 2012

Хорошо, ребята,

После многих чтений и нахождения решений здесь мне просто нужно спросить об этом. Я уже искал это, но это не помогло мне так хорошо, как следовало разобраться в этом. Кроме того, извините меня за мои грамматические ошибки, если таковые имеются ...

В чем проблема? Я загружаю форму WPF с помощью комбинированного списка. Этот комбинированный список получает все имена из всех таблиц в моей базе данных. Я выбираю имя таблицы и нажимаю кнопку, чтобы заполнить DataGrid (WPF) выбранной таблицей. Это все работает отлично. Но затем, когда я изменил ячейку или добавил / удалил строку или столбец, я должен обновить это в базе данных. Вот где я застрял. Я получил это работать через не очень оптимальный способ. Поэтому я спрашиваю, есть ли лучшее решение.

//fill the datagrid with data from chosen table in combobox!            
selectedTable = cboxTables.SelectedItem.ToString();
dataset = db.getDataFromTable(selectedTable);
datatable = dataset.Tables[selectedTable];
datagridAdmin.ItemsSource = datatable.DefaultView;

И когда выбор в DataGrid изменился, я установил активную кнопку «Отправить», которая вызывает этот код:

db.updateTable(selectedTable, datatable);

Обратите внимание, что 'db' - это экземпляр моего класса базы данных. Метод заключается в следующем:

public bool updateTable(String tableName, DataTable datatable)
{
    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(thisConnection.ConnectionString, SqlBulkCopyOptions.CheckConstraints))
    {
        //Set destination table name
        //to table previously created.
        bulkcopy.DestinationTableName = tableName;

        try
        {
            thisCommand = new SqlCommand("DELETE FROM " + tableName, thisConnection);
            thisCommand.ExecuteNonQuery();
            bulkcopy.WriteToServer(datatable);
        }
        catch (Exception ex)
        {
            logger.WriteLine(applicationName, ex.Message);
        }
    }
}

Но проблема в том, что первый столбец - это идентификатор автоинкремента, который увеличивается каждый раз, когда я отправляю измененную DataGrid. Разве нет лучшего способа сделать это?

Спасибо!

PS: я пишу в Visual Studio 2010 с C # в WPF.

1 Ответ

1 голос
/ 31 января 2012

Короче говоря, для метода, который вы дали, было бы лучше использовать метод таблицы усечений перед вызовом вашей массовой копии, это вернет столбец Identity обратно к 0:

thisCommand = new SqlCommand("TRUNCATE TABLE " + tableName, thisConnection);

Однако любой из этих методовсобирается вызвать проблемы с внешними ключами в вашей базе данных.Я не уверен, как вы извлекаете свои данные в классе базы данных, но я бы хотел использовать SqlCommandBuilder для обновления базы данных, а не удалять и повторно вставлять все данные при каждом обновлении.

РЕДАКТИРОВАТЬ

Для дальнейшего объяснения моего предложения SqlCommandBuilder.

Модель ViewModel, такая как следующая, должна позволять использовать SqlCommandBuilder (Примечание: это чрезвычайно сокращено, и в реальном выражении этотребует лучшей проверки, обработки исключений и событий, но здесь есть грубая идея):

public class YourViewModel
{
    private SqlDataAdapter adapter;
    private DataTable table;
    private SqlCommandBuilder commandBuilder;
    public DataTable Table { get { return table; } set { table = value; } }
    public void LoadTable(string connectionString, string tableName, int[] primaryKeyColumns)
    {
        adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", tableName), connectionString);
        table = new DataTable();
        adapter.Fill(table);
        List<DataColumn> primaryKeys = new List<DataColumn>();
        for (int i = 0; i < primaryKeyColumns.Length; i++) 
        {
             primaryKeys.Add(table.Columns[primaryKeyColumns[i]]);
        }
        table.PrimaryKey = primaryKeys.ToArray();
        commandBuilder = new SqlCommandBuilder(adapter);
        commandBuilder.GetUpdateCommand();
    }
    public int Update()
    {
        if (table == null || table.Rows.Count == 0 || adapter == null) 
        {
             return 0;
        }
        if (table.PrimaryKey.Length == 0)
        {
            throw new Exception("Primary Keys must be defined before an update of this nature can be performed");
        }
        else
        {
            return adapter.Update(table);
        }
    }
}

Свяжите свойство Table с представлением сетки, а затем вызовите метод Update, когда потребуется.Вы можете даже связать обновление с событиями таблицы и т.д., чтобы автоматически обновить базу данных. Code Project содержит довольно хорошую статью по WPF, сеткам данных и интеграции баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...