Использование OleDbDataAdapter и DataSet для обновления Access.mdb - PullRequest
6 голосов
/ 03 мая 2011

Я пытаюсь обновить простую базу данных MS Access. Я получаю исключение для определенных таблиц, которое после поиска обнаружило Служба поддержки Microsoft - Синтаксическая ошибка . Я считаю, что это означает, что одно из имен столбцов использует зарезервированное слово. Похоже, что это так, поскольку все таблицы обновляются, за исключением таблиц с «GUID» в качестве одного из имен столбцов, зарезервированного слова. На этой странице также говорится, что я должен использовать OleDbAdapter и DataSet, которые должны решить проблему. К сожалению, я не могу изменить название столбца. Это вне моего контроля, поэтому я должен работать с тем, что мне дано.

Мне не приходилось много работать с базами данных, и все, что я знаю, я узнал из примеров из интернета (вероятно, плохих). Итак, как правильно обновить базу данных, используя OleDbAdapter и dataSet?

Не думаю, что мне следует использовать DataTable или OleDbCommandBuilder, и я считаю, что решение как-то связано с параметрами. Но мои навыки в Google слабы.

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " +
                            Data Souce=" + source);
conn.Open();
OleDbAdapter adapter = new OleDbDataAdapter("SELECT * From " + table, conn);
OleDbCommandBuiler cmdBuiler = new OleDbCommandBuilder(adapter);
DataSet = new DatSet();
adapter.InsertCommand = cmdBuilder.GetInertCommand(true); // Is this necessary?
adapter.Fill( dataSet, table);
DataTable dataTable = dataSet.Tables[table]; // Do I need a DataTable?
DataRow row = dataTable.
row [ attribute ] = field; // Do this for all attributes/fields. I think this is wrong.
dataTable.rows.Add(row);
adapter.Update(dataTable); //<--"Syntax error in INSERT INTO statement." Exception

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Проблема может заключаться в том, что имена столбцов (особенно те, чье имя являются зарезервированными словами) должны быть заключены в квадратные скобки.OleDbCommandBuilder, когда он создает свой собственный InsertCommand, не заключает имена в квадратные скобки, поэтому решение состоит в том, чтобы вручную определить InsertCommand OleDbDataAdapter:

adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO {0} ([GUID], [fieldName]) Values (@guid,@fieldName);", table), conn);

Определение параметров для каждого столбца, а затем вручную добавить параметрvalues;

adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["GUID"]));

Подводя итог, для таблиц, имеющих столбец с именем "GUID", следует попробовать что-то вроде следующего:

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + 
"Data Souce=" + source);                          
conn.Open(); 

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * From " + table, conn);
OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapter);

adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO {0} ([GUID], [fieldName]) Values (@guid,@fieldName);", table), conn);

DataTable dataTable = new DataTable(table);
adapter.Fill( dataTable);
DataRow row = dataTable.NewRow();
row [ fieldName ] = fieldValue;
// eg: row [ "GUID" ] = System.Guid.NewGuid().ToString(); // Do this for all attributes/fields.
dataTable.Rows.Add(row);

adapter.InsertCommand.Parameters.Add(new OleDbParameter("@fieldName",row[fieldName]));
// eg: adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["GUID"]));

adapter.Update(dataTable);
0 голосов
/ 04 мая 2011

Хорошим началом будет использование DataSetDesigner и Typed DataSets, чтобы начать пробовать этот шаг: http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

Хорошим долгосрочным подходом является использование вместо этого Sql Server Express, тогда у вас будет выбориспользования: Entity Framework, Linq To Sql или по-прежнему использовать DataSetDesigner и Typed DataSets.

0 голосов
/ 04 мая 2011

Что касается задачи № 1. Попробуйте выполнить полное определение имени столбца, то есть table.columnName (это решает проблему в MySQL, а может, и в Access), также попробуйте поместить [] вокруг имени столбца.

Выбор * обычно является плохим вариантом для указания имен столбцов и использования псевдонимов. Например, используйте Select Column1 как «Column1», Column2 как «Column2» .... это значительно упрощает работу с вашим набором данных и данными, поскольку вы можете получить доступ к столбцу по его псевдониму, а не по индексам столбцов.

Я считаю, что DataAdapter гораздо полезнее для заполнения наборов данных, чем для фактического изменения базы данных. Я рекомендую что-то вроде:

string updateQuery = "Update ..... Where ...."; //do your magic here
OldDbcommand command = new OleDbCommand(updateQuery);
command.Connection = conn;
conn.Open();
con.ExecuteNonQuery();
conn.Close();

Вы можете заполнить свой набор данных адаптером, а затем сделать, как я только что выполнил ваши команды обновления в БД.

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