我尝试使用来自ARCHIVES_MASTER_TBL的信息填充此DataSet,当我运行查询时选择与十年和产品系列相匹配的产品,但它给了我错误:&#34 ;没有给出一个或多个必需参数的值。"
OleDbConnection dbConn;
OleDbDataAdapter dbCmdDecade;
dbConn = new OleDbConnection(connectionString);
dbConn.Open();
dbCmdDecade = new OleDbDataAdapter("Select * From ARCHIVE_MASTER_TBL WHERE DECADE_1=" + decade + "AND PRODUCT_LINE=" + productLine, dbConn);
DataSet ds = new DataSet();
dbCmdDecade.Fill(ds, "products");
在添加" +" AND PRODUCT_LINE ="之前有效。 + productLine"部分但我需要更具体的搜索,只选择适合十年和产品的那些
答案 0 :(得分:1)
你不应该编写连接字符串的sql命令。这是众所周知的错误源(解析错误)和称为Sql Injection.的安全风险 相反,您应该使用允许您指定值的确切数据类型的参数,并让数据库引擎使用它们而不进行转换
例如,您的查询失败,因为PRODUCT_LINE
列的类型为text,因此,如果要搜索此列,则应将值括在引号之间,但是,如果值包含该值,该怎么办?一个或多个引号?您需要用几个单引号替换任何单引号。在任何时候,您的查询都变得不可读,并且错误的可能路径会成倍增加。
而是使用参数化查询:
string cmd = @"Select * From ARCHIVE_MASTER_TBL
WHERE DECADE_1=@decade AND PRODUCT_LINE=@line";
using(OleDbConnection dbConn = new OleDbConnection(connectionString))
using(OleDbDataAdapter dbCmdDecade = new OleDbDataAdapter(cmd, dbConn))
{
dbConn.Open();
dbCmdDecade.SelectCommand.Parameters.Add("@decade", OleDbType.Integer).Value = decade;
dbCmdDecade.SelectCommand.Parameters.Add("@line", OleDbType.VarWChar).Value = productline;
DataSet ds = new DataSet();
dbCmdDecade.Fill(ds, "products");
}
您的代码和数据库之间的误解更清晰,没有空间