Отсутствует обязательный параметр в параметризованном запросе?
Я получаю следующую ошибку, пытаясь выполнить код ниже
Не указано значение для одного или нескольких обязательных параметров.
string paraName = "CONTROL";
string fullPathToExcel = @"C:\Users\xbbjn2h\Desktop\Mapping.xlsx";
string connString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""",fullPathToExcel);
string sql = "SELECT [FUNCTION],[NAME] from [Sheet1$] WHERE [FUNTION] = ?";
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = connString;
using (OleDbCommand cmd = new OleDbCommand(sql, conn))
{
cmd.Parameters.AddWithValue("?", paraName);
DataSet ds = new DataSet();
conn.Open();
OleDbDataAdapter dab = new OleDbDataAdapter(cmd);
dab.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
conn.Close();
}
2 ответа
Джеймс, я вижу, что вы пытаетесь параметризоваться так же, как SQL
, тем не мение OleDb
не будет следовать точному образцу. В OleDb
Вы можете просто поставить вопросительные знаки в вашем предложении sql и заполнить их позже, используя Parameter.Add().value
что довольно просто.
Как указывает MSDN:
Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в оператор SQL или хранимую процедуру, вызываемую OleDbCommand, если для CommandType задано значение Text.
Я переписал ваш код так, как он должен выглядеть
string paraName = "CONTROL";
string fullPathToExcel = @"C:\Users\xbbjn2h\Desktop\Mapping.xlsx";
string connString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""",fullPathToExcel);
string sql = string.Format("SELECT [{0}],[{1}] from [{2}] WHERE [{0}] = ?", strFunction, strName, strSheetName);
conn.ConnectionString = connString;
using (OleDbConnection conn = new OleDbConnection())
{
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.Parameter.Add("@Param1", OleDbType.VarChar).Value = paraName; // paraName or any value you wish.
DataSet ds = new DataSet();
conn.Open();
OleDbDataAdapter dab = new OleDbDataAdapter(cmd); //or cmd.ExecuteNonQuery(); in Insert sql commands.
dab.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
conn.Close();
}
Примечание, вы должны поставить свой OleDbConnection
внутри using
утверждение, а не ваш OleDbCommand
, Я не проверял это, и это может содержать небольшую ошибку. Кроме этого пробейте его и нажмите кнопку воспроизведения (F5).
Вы можете найти больше на OleDb
параметризация из свойства OleDbCommand.Parameters
Удачи и дайте нам знать, что происходит.
OleDbCommand не поддерживает именованные параметры (см. Документы). Что вам нужно сделать, это что-то вроде:
cmd.Parameters.Add(new OleDbParameter { Value = paraName });
Редактировать: я не пробовал, но я полагаю, что возможно использовать ваш код выше и передать ноль в качестве аргумента имени...