OleDbDataReader - 没有为一个或多个必需参数提供值
OleDbDataReader - No value given for one or more required parameters
我正在尝试使用 BulkInsert 将 Excel 电子表格中的数据添加到 SQL 服务器中的 table。联机帮助非常好,但我收到一个我不明白的错误。
这是我用来获取和保存目标 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: No value given for one or more required parameters." 这一行:
OleDbDataReader rdrExcel = cmdExcel.ExecuteReader();
我查看了所有内容,但这似乎是正确的语法。即使 MSDN entry 也说这是正确的。
table 存在于我的数据库中,我已经仔细检查了 table、工作表和字段名称。电子表格中没有空值(对 Whosebug 上类似帖子的几个回复说这可能是问题所在)。
有什么帮助吗?谢谢
您在 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);
}
}
对于之后的任何人:
我发布的 SQL 语法似乎适用于 SELECT *,但不适用于 SELECT [某些字段]。我不知道为什么,但如果您遇到同样的问题,您可以导入 Excel 文件中的所有字段,然后编写代码以仅使用您实际需要的数据。
我确信有更好的答案,这个变通办法让我的老板不再支持我。
在您的连接字符串中,您将 "first row is column name" (HDR) 设置为 "NO",因此 select 只能与“*”一起使用。
尝试:
string strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
我正在尝试使用 BulkInsert 将 Excel 电子表格中的数据添加到 SQL 服务器中的 table。联机帮助非常好,但我收到一个我不明白的错误。
这是我用来获取和保存目标 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: No value given for one or more required parameters." 这一行:
OleDbDataReader rdrExcel = cmdExcel.ExecuteReader();
我查看了所有内容,但这似乎是正确的语法。即使 MSDN entry 也说这是正确的。
table 存在于我的数据库中,我已经仔细检查了 table、工作表和字段名称。电子表格中没有空值(对 Whosebug 上类似帖子的几个回复说这可能是问题所在)。
有什么帮助吗?谢谢
您在 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);
}
}
对于之后的任何人:
我发布的 SQL 语法似乎适用于 SELECT *,但不适用于 SELECT [某些字段]。我不知道为什么,但如果您遇到同样的问题,您可以导入 Excel 文件中的所有字段,然后编写代码以仅使用您实际需要的数据。
我确信有更好的答案,这个变通办法让我的老板不再支持我。
在您的连接字符串中,您将 "first row is column name" (HDR) 设置为 "NO",因此 select 只能与“*”一起使用。
尝试:
string strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";