Использование OleDbDataAdapter и DataSet для обновления доступа.MDB-компонента

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

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

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

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 ответов


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

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

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

adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["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);

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

Select * обычно является плохим вариантом для указания имен столбцов и использования псевдонимов. Например, использовать выберите Столбец1, как 'Столбец1', Столбец2, как 'Столбец2' .... это упрощает работу с dataset и datatable, так как вы можете получить доступ к столбцу по его псевдониму, а не по индекс столбца.

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

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

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


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

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