使用mutliple条件从select语句填充DataSet

时间:2016-05-20 21:54:59

标签: c# asp.net dataset

我尝试使用来自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"部分但我需要更具体的搜索,只选择适合十年和产品的那些

1 个答案:

答案 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");
}

您的代码和数据库之间的误解更清晰,没有空间