2012-04-16 7 views
1

Я пытался использовать OleDbDataAdapter обновить DataTable но запутался о командах. Поскольку я иногда получаю информацию из разных таблиц, я не могу использовать CommandBuilder. Итак, я попытался создать команды на моем, но с жесткими параметрами нашел это. DataTable.GetChanges возвращает строки, которые должны использовать команду INSERT или UPDATE - я думаю, я не могу различить между ними. Мне нужно, чтобы выполнить следующие действия:Использование OleDbDataAdapter обновить DataTable C#

DataTable dt = new DataTable(); 
OleDbDataAdapter da = new OleDbDataAdapter(); 
// Here I create the SELECT command and pass the connection. 
da.Fill(dt); 
// Here I make changes (INSERT/UPDATE) to the DataTable (by a DataGridView). 
da.UpdateCommand = new OleDbCommand("UPDATE TABLE_NAME SET (COL1, COL2, ...) VALUES (@newVal1, @newVal2, ...) WHERE [email protected]"); // How can I use the values of the current row (that the da is updating) as the parameters (@newVal1, @newVal2, id....)? 

Большое спасибо!

ответ

2

Адаптер данных может работать совместно с DataTable. Таким образом, я фактически объединил свою группу в класс и хорошо работал. Помимо сложностей моих вещей, вот фрагмент, который может помочь вам. При добавлении параметра вы можете определить источник столбца, из которого данные поступают из FROM DataTable. Таким образом, когда запись внутренне идентифицируется как «Добавлена» или «Обновлена» (или «Удалена»), когда вы создаете команды SQL Insert/Update/Delete, она вытаскивает данные из столбцов из соответствующих строк.

Например. Скажем, у меня есть DataTable, первичный ключ - «MyID» и имеет столбцы «ColX, ColY, ColZ». Я создаю мой DataAdapter и построить мой выбор, обновление, удаление командам что-то вроде ... (? Это место, держатель для параметров)

DataAdapter myAdapter = new DataAdapter() 

myAdapter.SelectCommand = new OleDbCommand(); 
myAdapter.InsertCommand = new OleDbCommand(); 
myAdapter.UpdateCommand = new OleDbCommand(); 
myAdapter.DeleteCommand = new OleDbCommand(); 

myAdapter.SelectCommand.CommandText = "select * from MyTable where MyID = ?"; 
myAdapter.InsertCommand.CommandText = "insert into MyTable (ColX, ColY, ColZ) values (?, ?, ?)"; 
myAdapter.UpdateCommand.CommandText = "update MyTable set ColX = ?, ColY = ?, ColZ = ? where MyID = ?"; 
myAdapter.DeleteCommand.CommandText = "delete from MyTable where MyID = ?"; 

Теперь каждый должен иметь свои соответствующие «Параметры». Параметры должны быть добавлены в той же последовательности, что и их соответствующие «?» местоблюститель.

// Хотя я собираю фиктивные значения для подготовки параметров, это просто для целей типа данных //. Он переоденется через адаптер данных, когда он применяет изменения

OleDbParameter oParm = new OleDbParameter("myID", -1); 
oParm.DbType = DbType.Int32; 
oParm.SourceColumn = "myID"; // <- this is where it looks back to source table's column 
oParm.ParameterName = "myID"; // just for consistency/readability reference 

myAdapter.SelectCommand.Parameters.Add(oParm); 

сделать аналогичен для остальных параметров в зависимости от их типов ... CHAR, INT, двойной, независимо

Опять же, у меня есть, как у класс оболочки, который обрабатывает управление на основе таблицы ...Коротко

public myClassWrapper 
{ 
    protected DataTable myTable; 
    protected DataAdapter myAdapter; 
    ... more ... 

    protected void SaveChanges() 
    { 
    } 
} 

его более сложным, чем только это, но во время «SaveChanges», The DataTable и DataAdapter в синхронизации для своих собственных целей. Теперь промойте данные. Я проверяю статус таблицы, а затем вы можете передать всю таблицу в dataAdapter для обновления, и она будет циклически перебирать все измененные записи и нажимать соответствующие изменения. Однако вам придется ловить все возможные ошибки данных.

myAdapter.Update(this.MyTable); 

Как считает каждую «запись» изменен, она тянет значения из столбца источника, как это определено параметром, который найден в таблице передается к адаптеру для обработки.

Надеюсь, это дало вам огромный скачок на то, что вы используете.

---- К.П PER ОБРАТНОЙ ----

Я бы поставить обновление в Try/уловом, и шаг в программу, чтобы увидеть, что исключение. Сообщение adn/или внутреннее исключение ошибки может дать больше информации. Однако попробуйте упростить UPDATE, чтобы включить только поля FEW с элементом WHERE «Key».

Кроме того, и я опечалился, пропустил это из ответа первой части. Возможно, вам придется идентифицировать столбец «PrimaryKey» данных. Для этого его свойство DataTable, которое ожидает, и массив столбцов, которые представляют первичный ключ для таблицы. Что я сделал ...

// set the primary key column of the table 
DataColumn[] oCols = { myDataTbl.Columns["myID"] }; 
myDataTbl.PrimaryKey = oCols; 

Я бы прокомментировал вашу полную строку обновления и все ее параметры для вашего ОБНОВЛЕНИЯ. Затем построить его так же просто, как мой образец только установки 2-3 столбцов и где п

myAdapter.UpdateCommand.CommandText = "update MyTable set ColX = ?, ColY = ? where MyID=?"; 
Add Parameter object for "X" 
Add Parameter object for "Y" 
Add Parameter object for "MyID" 

Пика полей, как межд или полукокса, таким образом они имеют наименьшую вероятность проблем для преобразования типов данных, а затем, как только это работает, попробуйте добавить все свои столбцы «int» и «character» ... затем добавьте другие. Кроме того, в какой базе данных вы идете против. В некоторых базах данных не используется «?» в качестве заполнителя в команде, но использовать «под названием» параметры, некоторые с помощью

"actualColumn = @namedCol" 
or even 
"actualColumn = :namedCol" 

Надежда это получает вас горб ...

+0

Спасибо. У меня все еще проблема с выполнением метода Update. В нем говорится, что мне не хватает значения одного из параметров. Возможно ли, что проблема в том, что я не использую набор данных? (Я просто использую DataTable и привязываю его к DataGridView с объектом BindingSource). Спасибо (: – gavra

+0

@gavra, см. Расширенный ответ, дайте мне знать. – DRapp

+0

Большое вам спасибо! На этот раз проблема заключалась в том, что я попытался обновить столбец первичного ключа. Теперь он отлично работает, я оберну его и буду использовать это в моем проекте. Приятного дня! – gavra

1

Вы можете использовать String.Format Method заменить @newVal1, @newVal2, ... в вашем коде, как этот da.UpdateCommand = new OleDbCommand(String.Format("UPDATE TABLE_NAME SET (COL1, COL2, ...) VALUES ({0}, {1}, ...) WHERE [email protected]",OBJECT_ARRAY_CONTAINING_VALUES_FROM_THEDG));

[Eidt на комментарий]

Чтобы справиться с row[0], row[1] вам нужен цикл вроде:

for(i=0; i<rows.Count; i++) {

        da.UpdateCommand = new OleDbCommand(String.Format("UPDATE ... ",row[i]);

        da.Update(dt);

}

+0

Спасибо за ваш ответ. Я знаю этот метод. Проблема заключается в обновлении всех строк в datatable, и у меня есть только одна команда обновления. Например, я мог бы использовать в качестве строки параметров [0] .myColumn, и после этого параметром должны быть строки [1] .myColumn. Я также заметил, что есть способ обновления без определения команды обновления. Просто не понял, как это сделать. – gavra

+0

Вы просмотрели документацию [DataAdapter.Update] (http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx) от Microsoft? –

Смежные вопросы