参数化查询中缺少必需参数?

时间:2015-01-18 14:14:06

标签: c# oledb parameterized-query

尝试执行以下代码时出现以下错误

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

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 个答案:

答案 0 :(得分:0)

OleDbCommand不支持命名参数(参见the docs)。你需要做的是:

cmd.Parameters.Add(new OleDbParameter { Value = paraName });

编辑:我没有尝试过,但我想可以使用上面的代码并传递null作为名称参数......

答案 1 :(得分:0)

詹姆斯,我可以看到你正试图像SQL那样进行参数化。但是OleDb不会遵循确切的模式。在OleDb中,您可以简单地在您的sql语句中添加问号,然后使用Parameter.Add().value填写它们,这非常简单。

正如MSDN参考指出:

  

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   CommandType设置为Text时的OleDbCommand。

我已经按照它应该的样子重写了你的代码

    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)。

您可以在OleDbCommand.Parameters Property

OleDb参数化中找到更多信息

祝你好运,让我们知道会发生什么。