我正在尝试更新一个简单的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
Run Code Online (Sandbox Code Playgroud)
问题可能是列名(特别是那些名称是保留字的列名)应该用方括号括起来。OleDbCommandBuilder 在创建自己的 InsertCommand 时,不会用括号将名称括起来,因此解决方案是手动定义 OleDbDataAdapter 的 InsertCommand:
adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO {0} ([GUID], [fieldName]) Values (@guid,@fieldName);", table), conn);
Run Code Online (Sandbox Code Playgroud)
为每列定义参数,然后手动添加参数值;
adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["GUID"]));
Run Code Online (Sandbox Code Playgroud)
总而言之,对于具有名为“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);
Run Code Online (Sandbox Code Playgroud)