从具有多个条件的 select 语句填充数据集
Filling a DataSet from a select statement with mutliple conditions
我试图用来自 ARCHIVES_MASTER_TBL 的信息填充此数据集,当我 运行 查询选择与十年和产品线匹配的产品时,它给我错误: "No value given for one or more required parameters."
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”部分之前有效,但我需要搜索更具体并且只选择适合十年和产品的搜索
您不应该编写 sql 命令来连接字符串。这是众所周知的错误(解析错误)来源和称为 Sql Injection.
的安全风险
相反,您应该使用允许您指定值的确切数据类型的参数,并让数据库引擎在不进行转换的情况下使用它们
例如,您的查询失败,因为 PRODUCT_LINE
列是文本类型,因此,如果您要搜索该列,则该值应该用引号引起来,但是,如果值包含一个或多个引号?。您需要用几个单引号替换任何单引号。您的查询很快就会变得不可读,错误的可能路径会成倍增加。
而不是参数化查询你有:
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");
}
更加清晰,没有 space 您的代码和数据库之间的误解
我试图用来自 ARCHIVES_MASTER_TBL 的信息填充此数据集,当我 运行 查询选择与十年和产品线匹配的产品时,它给我错误: "No value given for one or more required parameters."
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”部分之前有效,但我需要搜索更具体并且只选择适合十年和产品的搜索
您不应该编写 sql 命令来连接字符串。这是众所周知的错误(解析错误)来源和称为 Sql Injection.
的安全风险
相反,您应该使用允许您指定值的确切数据类型的参数,并让数据库引擎在不进行转换的情况下使用它们
例如,您的查询失败,因为 PRODUCT_LINE
列是文本类型,因此,如果您要搜索该列,则该值应该用引号引起来,但是,如果值包含一个或多个引号?。您需要用几个单引号替换任何单引号。您的查询很快就会变得不可读,错误的可能路径会成倍增加。
而不是参数化查询你有:
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");
}
更加清晰,没有 space 您的代码和数据库之间的误解