【问题标题】:OleDbcommand: How to use 'In' - clause with parameters?OleDbcommand:如何使用带有参数的“In”子句?
【发布时间】:2017-02-16 13:28:51
【问题描述】:

我的 Web 应用程序中有一个 OleDB 连接,该连接使用几个搜索参数(OrderIDLineNumber)作为输入链接到 MS Access 数据库。这在过去几年运行良好。

现在我被要求启用对多个 LineNumbers 的搜索(例如:2,3,8)。 如果我对此进行硬编码,它当然可以:

and ([Position] in ('2','3','8') or @LINENUM ='')

如何使用给定的输入格式作为逗号分隔的字符串动态地实现这一点?

我试图用 C# 在 OleDBcommand 字符串之外用LineNumbers 构建一个字符串,然后传递参数,但它不起作用。

and ([Position] in @LineNumbers or @LINENUM ='')

我还尝试在 OleDB 命令中使用LineNumbers 构建一个表,例如:

DECLARE @LineNumber TABLE (Value INT)
INSERT INTO @LineNumber VALUES (2)
INSERT INTO @LineNumber VALUES (3)
INSERT INTO @LineNumber VALUES (8)

and ([Position] IN (SELECT Value FROM @LineNumber))

然后是错误

“无效的 SQL 语句;需要 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'”

被扔了。

我该怎么做?


这是我的代码的样子:

string SelectOleDb = @"SELECT SalesID, CertificationID, CalibrationDate, Path
                       FROM Zeugnis WHERE (SalesID = @SALESID or @SALESID = '') 
                               and ([Position] = @LINENUM or @LINENUM ='')

                       UNION ALL

                       SELECT SalesID, CertificationID, CalibrationDate, Path
                       FROM Zeugnis_2016 WHERE (SalesID = @SALESID or @SALESID = '') 
                               and ([Position] = @LINENUM or @LINENUM ='')

                       UNION ALL

                       SELECT SalesID, CertificationID, CalibrationDate, Path
                       FROM Zeugnis_2015 WHERE (SalesID = @SALESID or @SALESID = '') 
                               and ([Position] = @LINENUM or @LINENUM ='')
                       ORDER BY CalibrationDate, CertificationID";

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\XXXXXXXX");
OleDbCommand cmd = new OleDbCommand();
OleDbDataAdapter da = new OleDbDataAdapter();
cmd = new OleDbCommand(SelectOleDb, con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("SALESID", SALESID.Text);
cmd.Parameters.AddWithValue("LINENUM", LINENUM.Text);

【问题讨论】:

    标签: c# ms-access oledb oledbcommand


    【解决方案1】:

    我认为您需要更改此行:

    and ([Position] in @LineNumbers or @LINENUM ='')
    

    在 C# 中类似这样的东西:

    string LineNumber = "('2','3','8')"; // build this string dynamically
    
    string sqlCondition = " and ([Position] in " + LineNumbers + " or @LINENUM ='')";
    

    然后将sqlCondition 字符串连接到您的主SELECT 字符串。

    如果您想要完整的示例,请发布通过 OleDB 运行 SQL 查询的完整代码 sn-p。

    【讨论】:

    • [Position] 是选择字符串中的一列,因此不能在 sqlCondition 字符串中静态使用。或者您是否提议动态构建查询然后执行它?我猜这不适用于 OdeDb。
    • @Barnabeck 是的,我建议你动态构建这个string SelectOleDb 字符串,而不是使用这个参数cmd.Parameters.AddWithValue("LINENUM", LINENUM.Text); 来传递IN 子句的可能值列表。
    • 现在我明白了!谢谢你。我很困惑,因为我认为您的提示指向 DynamicSQL。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-02-07
    • 2023-02-16
    相关资源
    最近更新 更多