使用OleDbDataAdapter和DataSet更新Access.mdb

时间:2011-05-03 19:50:08

标签: c# ms-access

我正在尝试更新一个简单的ms访问数据库。我在某些表上得到一个例外,在搜索之后,我找到了Microsoft Support - Syntax Error。我相信这意味着其中一个列名使用保留字。这似乎是这种情况,因为除了具有“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 个答案:

答案 0 :(得分:4)

问题可能是列名(特别是名称为保留字的列名)应该用方括号括起来。 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 :(得分:0)

关于问题#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();

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

答案 2 :(得分:0)

一个好的起点是使用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。