在excel中更新列时获取Oledb异常

时间:2012-03-16 13:52:13

标签: c# excel oledb

我收到以下错误“没有给出一个或多个必需参数的值。”在下面代码的ExceuteNonQuery()行上。

        System.Data.OleDb.OleDbConnection finalConnection;
        System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
        string sql = null;
        finalConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source ='c:\\temp\\test.xlsx'; Extended Properties ='Excel 12.0 Xml;HDR=NO';");
        finalConnection.Open();
        myCommand.Connection = finalConnection;
        foreach (VinObject v in VinList)
            {
            sql = "Update [Sheet1$] set O = ? where S = ?;";
            myCommand.Parameters.Add(new OleDbParameter("@amt", v.CostNewAmt));
            myCommand.Parameters.Add(new OleDbParameter("@vin", v.VIN));
            myCommand.CommandText = sql;
            myCommand.ExecuteNonQuery();
            }
        finalConnection.Close();

我每次都尝试使用单独的命令,同样的错误。

    foreach (VinObject v in VinList)
            {
            using (OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source ='c:\\temp\\test.xlsx'; Extended Properties ='Excel 12.0 Xml;HDR=No';"))
                {
                con.Open();
                string query = @"UPDATE [Sheet1$] SET O = ? WHERE S = ?";
                OleDbCommand cmd = new OleDbCommand(query, con);
                cmd.Parameters.AddWithValue("@param1", v.CostNewAmt);
                cmd.Parameters.AddWithValue("@param2", v.VIN);
                cmd.ExecuteNonQuery();
                con.Close();
                }
            }

我可以将其修改为插入并插入到新的Excel电子表格中,但对于我的生活,无法使此更新生效。知道我做错了什么吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您收到错误,因为Excel无法识别列字母别名“O”和“S”。它需要实际的列“name”,它是第一个填充行中单元格的值。如果该单元格中没有有效值,或者您在连接字符串中指定了HDR=NO,则列将命名为F1F2 ... Fn。如果您不确定推断的列名称是什么,请使用OleDbConnection.GetSchema(String,String[])OleDbDataReader.GetName(Int32)检查名称。

由于您在连接字符串中指定了HDR=NO,因此正确的SQL可能是

"Update [Sheet1$] set F15 = ? where F19 = ?;"

供将来参考,请查看: