Отсутствует обязательный параметр в параметризованном запросе?

Я получаю следующую ошибку, пытаясь выполнить код ниже

Не указано значение для одного или нескольких обязательных параметров.

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 });

Редактировать: я не пробовал, но я полагаю, что возможно использовать ваш код выше и передать ноль в качестве аргумента имени...

Другие вопросы по тегам