簡體   English   中英

在參數化查詢中缺少必需的參數?

[英]Missing Required Parameter in 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();
}        

OleDbCommand不支持命名參數(請參閱docs )。 您需要做的是:

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

編輯:我還沒有嘗試過,但是我想可能可以使用上面的代碼並將null作為name參數傳遞...

詹姆斯,我可以看到您正在嘗試使用SQL進行參數化。 但是, OleDb不會遵循確切的模式。 OleDb您可以簡單地在SQL語句中添加問號,並稍后使用Parameter.Add().value其填滿。

正如MSDN參考指出的那樣:

當CommandType設置為Text時,OLE DB .NET Provider不支持將命名參數傳遞給SQL語句或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屬性中找到有關OleDb參數化的更多信息

祝你好運,讓我們知道會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM