【问题标题】:Using OleDbDataAdapter and DataSet to update Access.mdb使用 OleDbDataAdapter 和 DataSet 更新 Access.mdb
【发布时间】:2011-08-18 00:12:12
【问题描述】:

我正在尝试更新一个简单的 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

【问题讨论】:

    标签: c# ms-access


    【解决方案1】:

    关于问题#1。尝试对列名进行完整限定,即 table.columnName(这可以解决 MySQL 中的问题,所以它可能在 Access 中也可以),尝试将 [ ] 放在列名周围。

    选择 * 通常是指定列名和使用别名的糟糕选择。例如使用 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();
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这成功了,但我仍然必须使用 DataSet。否则它将在adapter.Fill 处引发异常。例外是System.ArgumentException{"Object is not an ADODB.RecordSet or an ADODB.Record.\r\nParameter name: adodb"}。谢谢马特。
      • 谢谢,这是我对 SO 的第一个回答,所以我很高兴它对你有用!
      • 如果你使用OleDbCommandBuilder,你可以使用cmdBuilder.QuotePrefix = "[";cmdBuilder.QuoteSuffix = "]";
      【解决方案3】:

      使用 DataSetDesigner 和 Typed DataSets 是一个不错的起点 试试这个:http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

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

      【讨论】:

        猜你喜欢
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 2020-06-13
        相关资源
        最近更新 更多