错误需要一个或多个参数

时间:2018-03-30 14:18:07

标签: c# oledb

这是C#代码并且给我一个错误,访问数据库中需要一个或多个参数可以帮助我吗?...由于这个错误我被绞死了!

以下是代码:

string date = textBox1.Text; 
con = new OleDbConnection(cs); 
con.Open();        
String sql = "SELECT * From Sales where InvoiceDate = date "; 
cmd = new OleDbCommand(sql, con); 
cmd.ExecuteNonQuery(); 
DataTable dt = new DataTable(); 
dt.Load(cmd.ExecuteReader()); 
dataGridView1.DataSource = dt; 

2 个答案:

答案 0 :(得分:0)

第一个缺陷:你没有提到cs是什么意思(我的意思是告诉我们连接字符串)但没有太大的问题,因为它没有抛出错误

第二个缺陷InvoiceDate = date,此处date既不是值也不是变量。

将其用作变量

 ...InvoiceDate ='" + date + "'"

将其用作直接值

 ...InvoiceDate ='date'"

第三个缺陷cmd.ExecuteNonQuery,这是不必要的。

第四个缺陷:嗯,我不应该把它称为缺陷,而不是一点知识共享:你可以创建一个单独的DataAdapter,然后用它来填充你的表:

 OleDbDataAdapter ada = new OleDbDataAdapter(cmd);
 ada.Fill(mydatatable);

最大的漏洞Sql-Injection,请不要让攻击者轻松。请使用parameters

 "SELECT * From Sales where InvoiceDate=@date"
 cmd.Parameters.Add("@date", OleDbType.Varchar).Vale = dateStringHere ///change data-type from varchar as required

答案 1 :(得分:0)

首先,我建议将该日期解析为DateTime,因为我希望您的InvoiceDate是数据库中的实际日期类型。其次,您需要使用参数传递值。最后删除ExecuteNonQuery。您还应该将一次性物品放入使用语句中,以便正确关闭连接。

DateTime date;
if(!DateTime.TryParse(textBox1.Text, out date))
{
    //Do whatever you need to indicate a bad date.
}

using(var con = new OleDbConnection(cs))
{
    con.Open();        
    String sql = "SELECT * From Sales where InvoiceDate = @date"; 
    using(var cmd = new OleDbCommand(sql, con))
    {
        cmd.Parameters.Add("@date", /*Insert correct type here*/).Value = date;
        DataTable dt = new DataTable(); 
        dt.Load(cmd.ExecuteReader()); 
        dataGridView1.DataSource = dt; 
    }
}