使用OleDbDataAdapter和DataSet更新Access.mdb

本文关键字:Access mdb 更新 DataSet OleDbDataAdapter 使用 | 更新日期: 2023-09-27 17:54:23

我正在尝试更新一个简单的ms访问数据库。我在某些表上得到一个异常,经过搜索,我发现微软支持-语法错误。我认为这意味着其中一个列名使用了保留字。这似乎是事实,因为所有表都更新了,除了那些将"GUID"作为列名之一(一个保留词)的表。本页还指出,我应该使用OleDbAdapter和DataSet,这应该解决这个问题。不幸的是,我不能更改列的名称。这是我无法控制的,所以我必须利用我得到的东西。

我不需要做太多的数据库工作,我所知道的一切都是从互联网上的例子中学到的(可能是不好的)。那么,使用OleDbAdapter和dataSet更新数据库的正确方法是什么?

我不认为我应该使用数据表或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

使用OleDbDataAdapter和DataSet更新Access.mdb

问题可能是列名(特别是那些名称是保留字的列名)应该用方括号括起来。OleDbCommandBuilder在创建自己的InsertCommand时,不会将名称用括号括起来,因此解决方案是手动定义OleDbDataAdapter的InsertCommand:

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"]));
总的来说,对于列名为"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 *通常是指定列名和使用别名的糟糕选项。例如,使用Select Column1 as 'Column1', Column2 as 'Column2' ....这使得使用数据集和数据表变得更加容易,因为您可以通过其别名而不是通过列索引访问列。

我发现DataAdapter对于填充数据集比实际修改数据库要有用得多。我建议这样写:

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

你可以用适配器填充你的数据集,然后像我刚才做的那样在DB上执行你的更新命令。

使用DataSetDesigner和类型化数据集开始是一个很好的开始试试下面的步骤:http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

一个好的长期方法是使用Sql Server Express代替,然后你可以选择使用:实体框架,Linq to Sql或仍然继续使用DataSetDesigner和类型化数据集。