OleDbDataReader - 没有给出一个或多个必需参数的值

时间:2015-06-19 16:35:03

标签: c# excel oledb bulkinsert oledbdatareader

我尝试使用BulkInsert将Excel电子表格中的数据添加到SQL Server中的表格。在线帮助相当不错,但我收到的错误我不明白。

以下是我用来获取和保存目标Excel文件的代码(使用FileUpload控件):

protected void btnGetFile_click(object sender, EventArgs e)
    {
        if (this.FileUpload1.HasFile)
        {
            this.FileUpload1.SaveAs(Server.MapPath("~/temp/") + this.FileUpload1.FileName);     
            ImportFromExcel(Server.MapPath("~/temp/") + this.FileUpload1.FileName);
        }
    }

这是我用来读取文件并执行批量插入的代码:

    public void ImportFromExcel(string excelFilePath)
    {
        //  Get connection string to database from web.config
        string strConnDB = ConfigurationManager.ConnectionStrings["strConnectToDB"].ConnectionString;
        //  Connection string for selected Excel file
        string strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

        string strExcelBatchQuery = "select LabBatch from [LabBatch$]";

        OleDbConnection connExcel = new OleDbConnection(strConnExcel);
        connExcel.Open();

        OleDbCommand cmdExcel = new OleDbCommand(strExcelBatchQuery, connExcel);

        OleDbDataReader rdrExcel = cmdExcel.ExecuteReader();

        SqlBulkCopy bulkCopy = new SqlBulkCopy(strConnDB);
        bulkCopy.DestinationTableName = "_trasher_excel_batch";

        while (rdrExcel.Read())
        {
            bulkCopy.WriteToServer(rdrExcel);
        }
        connExcel.Close();
    }

但是当我尝试这段代码时,我得到了错误," System.Data.OleDb.OleDbException:没有给出一个或多个必需参数的值。"在这一行:

OleDbDataReader rdrExcel = cmdExcel.ExecuteReader();

我看了一遍,但这似乎是正确的语法。即使MSDN entry说这是正确的。

该表存在于我的数据库中,并且我已经仔细检查了表,工作表和字段名称。电子表格中没有空值(Stackoverflow上对类似帖子的几个回复说可能是问题)。

有任何帮助吗?感谢。

3 个答案:

答案 0 :(得分:1)

您在SQL中指定了这个“[LabBatch $]”参数,但是您没有为它提供值。

修改

private static void ShowExcelWorksheetNames(OleDbConnection m_connexcel, string Filepath)
{
    try {
        DataTable ExcelSheets = m_connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {
            null,
            null,
            null,
            "TABLE"
        });
        foreach (DataRow row in ExcelSheets.Rows) {
            MessageBox.Show(row.Item("TABLE_NAME"));
        }
    } catch (Exception ex) {
        throw new Exception(ex.Message);
    }
}

答案 1 :(得分:1)

对于任何追随的人:

我发布的SQL语法似乎适用于SELECT *,但不适用于SELECT [some fields]。我不知道为什么,但是如果您遇到同样的问题,可以导入Excel文件中的所有字段,然后编写代码以仅使用您实际需要的数据。

我确定有更好的答案,这种解决方法让我的老板背上了我。

答案 2 :(得分:1)

在您的连接字符串中,您将“第一行是列名”(HDR)设置为“否”,因此选择只能使用“*”。

尝试:

text = [
    """
    <parent>
      <row ViewCount="1457" />
      <row ViewCount="1457" />
    </parent>
    """, 
    """
    <parent>
      <row ViewCount="1457" />
      <row ViewCount="1457" />
      <row ViewCount="1457" />
    </parent>
    """
]

rdd = spark.sparkContext.parallelize(text)
rdd.map(lambda x: find_number_of_rows(x)).collect()