Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数化查询中缺少必需的参数?_C#_Oledb_Parameterized Query - Fatal编程技术网

C# 参数化查询中缺少必需的参数?

C# 参数化查询中缺少必需的参数?,c#,oledb,parameterized-query,C#,Oledb,Parameterized Query,我在尝试执行下面的代码时遇到以下错误 没有为一个或多个必需参数提供值。 OleDbCommand不支持命名参数(请参阅)。您需要做的是: cmd.Parameters.Add(new OleDbParameter { Value = paraName }); 编辑:我还没有尝试过,但我想可能可以使用上面的代码并将null作为name参数传递…James,我可以看到您正在尝试使用SQL进行参数化。但是,OleDb不会遵循确切的模式。在OleDb中,您可以简单地在sql语句中添加问号,然后使用Pa

我在尝试执行下面的代码时遇到以下错误

没有为一个或多个必需参数提供值。


OleDbCommand不支持命名参数(请参阅)。您需要做的是:

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

编辑:我还没有尝试过,但我想可能可以使用上面的代码并将null作为name参数传递…

James,我可以看到您正在尝试使用
SQL
进行参数化。但是,OleDb不会遵循确切的模式。在
OleDb
中,您可以简单地在sql语句中添加问号,然后使用
Parameter.Add().value
来填充问号,这非常简单

正如MSDN参考资料所指出的:

OLE DB.NET提供程序不支持用于传递的命名参数 由调用的SQL语句或存储过程的参数 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
放入
中,而不是
OleDbCommand
。 我还没有测试它,它可能包含一些小错误。除此之外,在那里打它,然后按play(F5)

有关
OleDb
参数化的更多信息,请访问


祝您好运,并让我们知道发生了什么。

再次检查您的字段和表名。它可能拼错了。查看它花了一点时间,但您的查询中有一个输入错误。字段名为[FUNCTION],因此需要在WHERE子句中修复该名称。谢谢史蒂夫!虽然文档是正确的,因为它们引用了整个OleDb集合,但我应该指出,使用ACE/JET提供程序的OleDb接受命名参数。这并不意味着可以按任何顺序添加参数。您仍然需要按照它们在commandtext中作为占位符出现的确切顺序放置它们。
    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();
    }