这是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;
答案 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;
}
}