使用OleDbDataAdapter和DataSet更新Access.mdb

我正在尝试更新一个简单的ms访问数据库。 我在某些表上得到一个Exception,在搜索之后,我发现了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 

问题可能是列名(特别是名称为保留字的列名)应该用方括号括起来。 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。 尝试对列名称进行完全限定,即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(); 

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

一个好的起点是使用DataSetDesigner和Typed DataSet开始尝试这个步骤: http : //msdn.microsoft.com/en-us/library/ms171893( v = vs。80) .aspx

一个好的长期方法是使用Sql Server Express,然后您可以选择使用:Entity Framework,Linq To Sql或仍然继续使用DataSetDesigner和Typed DataSet。