OleDb 命令:如何使用 'In' - 带参数的子句?
OleDbcommand: How to use 'In' - clause with parameters?
我的 Web 应用程序中有一个 OleDB 连接,该连接使用几个搜索参数(OrderID
、LineNumber
)作为输入链接到 MS Access 数据库。这在过去几年中运作良好。
现在我被要求启用对多个 LineNumbers
的搜索(例如:2、3、8)。
如果我硬编码它当然可以工作:
and ([Position] in ('2','3','8') or @LINENUM ='')
如何使用给定的输入格式以逗号分隔的字符串动态实现此目的?
我试图用 C# 在 OleDB 命令字符串之外构建一个带有 LineNumbers
的字符串,然后传递参数,但它不起作用。
and ([Position] in @LineNumbers or @LINENUM ='')
我还尝试在 OleDB 命令中使用 LineNumbers
构建一个 table,例如:
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))
但随后出现错误
"Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or '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);
我认为你需要更改这一行:
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
字符串。
如果您想要完整的示例,那么 post 您的完整代码片段,它通过 OleDB 运行 SQL 查询。
我的 Web 应用程序中有一个 OleDB 连接,该连接使用几个搜索参数(OrderID
、LineNumber
)作为输入链接到 MS Access 数据库。这在过去几年中运作良好。
现在我被要求启用对多个 LineNumbers
的搜索(例如:2、3、8)。
如果我硬编码它当然可以工作:
and ([Position] in ('2','3','8') or @LINENUM ='')
如何使用给定的输入格式以逗号分隔的字符串动态实现此目的?
我试图用 C# 在 OleDB 命令字符串之外构建一个带有 LineNumbers
的字符串,然后传递参数,但它不起作用。
and ([Position] in @LineNumbers or @LINENUM ='')
我还尝试在 OleDB 命令中使用 LineNumbers
构建一个 table,例如:
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))
但随后出现错误
"Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or '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);
我认为你需要更改这一行:
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
字符串。
如果您想要完整的示例,那么 post 您的完整代码片段,它通过 OleDB 运行 SQL 查询。