C# 使用OleDbDataAdapter和DataSet更新Access.mdb

C# 使用OleDbDataAdapter和DataSet更新Access.mdb,c#,ms-access,C#,Ms Access,我正在尝试更新一个简单的ms access数据库。我在搜索后发现的某些表上有一个异常。我相信这意味着其中一个列名使用了保留字。似乎是这样的,因为除了GUID作为列名之一的表(保留字)之外,所有表都会更新。本页还说明我应该使用OleDbAdapter和DataSet,这应该可以解决问题。很遗憾,我无法更改列的名称。这超出了我的控制范围,所以我必须和别人一起工作 我不太需要处理数据库,而且我从互联网上的例子中学到的所有知识都可能是糟糕的。那么,使用OleDbAdapter和dataSet更新数据库的

我正在尝试更新一个简单的ms access数据库。我在搜索后发现的某些表上有一个异常。我相信这意味着其中一个列名使用了保留字。似乎是这样的,因为除了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

关于问题1。尝试对列名进行完全限定,即table.columnName,它修复了MySQL中的问题,因此在Access中也可能如此,尝试在列名周围放置[]

对于指定列名和使用别名,Select*通常是一个糟糕的选项。例如,使用Select Column1作为“Column1”,Column2作为“Column2”。。。。 这使得使用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();

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

问题可能是列名,特别是那些名称为保留字的列名,应该用方括号括起来。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);

一个好的起点是使用DataSetDesigner和类型化数据集 尝试以下步骤:


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

这就成功了,除了我不得不继续使用DataSet之外。否则,它将在adapter.Fill处引发异常。异常为System.ArgumentException{对象不是ADODB.RecordSet或ADODB.Record。\r\n参数名称:ADODB}。谢谢,马特。谢谢,这是我第一次回答这个问题,所以我很高兴它对你有帮助!如果您使用的是OleDbCommandBuilder,则可以使用cmdBuilder.QuotePrefix=[;和cmdBuilder.QuoteSuffix=];。