C# 是否可以在Where子句之外的其他位置使用OleDBCommand参数?
我有以下代码:C# 是否可以在Where子句之外的其他位置使用OleDBCommand参数?,c#,sql,ms-access,ms-access-2007,oledbcommand,C#,Sql,Ms Access,Ms Access 2007,Oledbcommand,我有以下代码: using (OleDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = string.Format( @"SELECT TOP {0} t_accounts.account_no as AccountID, IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name FROM t_accounts
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = string.Format(
@"SELECT TOP {0} t_accounts.account_no as AccountID, IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no = td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'", CountToFetch);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@firstId", FirstId);
cmd.CommandText =
@"SELECT TOP @countToFetch t_accounts.account_no as AccountID,
IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no =
td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'";
. . .
cmd.Parameters.AddWithValue("@firstId", FirstId);
cmd.Parameters.AddWithValue("@countToFetch", CountToFetch);
…但我想知道我是否也可以使用参数作为最高计数,例如:
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText =
@"SELECT TOP @count t_accounts.account_no as AccountID, IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no = td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@firstId", FirstId);
cmd.Parameters.AddWithValue("@count", CountToFetch);
…或者数据库参数仅限于WHERE子句
更新
使用此代码:
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = string.Format(
@"SELECT TOP {0} t_accounts.account_no as AccountID, IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no = td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'", CountToFetch);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@firstId", FirstId);
cmd.CommandText =
@"SELECT TOP @countToFetch t_accounts.account_no as AccountID,
IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no =
td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'";
. . .
cmd.Parameters.AddWithValue("@firstId", FirstId);
cmd.Parameters.AddWithValue("@countToFetch", CountToFetch);
…我得到,“SELECT语句包含拼写错误或缺少的保留字或参数名称,或者标点符号不正确。”
于是我又回到:
cmd.CommandText = string.Format(
@"SELECT TOP {0} t_accounts.account_no as AccountID,
IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no =
td_department_accounts.account_no)
WHERE (AccountID >= @firstId) AND type = 'DE'", CountToFetch);
. . .
cmd.Parameters.AddWithValue("@firstId", FirstId);
更新2
这:
…in Access告诉我“SELECT语句包含拼写错误或缺少的保留字或参数名称,或者标点符号不正确。”
注意:邮递员在拨打REST电话时会告诉我与查询结果完全相同的事情
更新3
我也在更新2中尝试过,但用“:”代替“@”,这样:
SELECT TOP (?) t_accounts.account_no as AccountID, IIF(ISNULL(t_accounts.name),'[blank]',t_accounts.name) AS Name
FROM t_accounts
INNER JOIN td_department_accounts ON (t_accounts.account_no = td_department_accounts.account_no)
WHERE (AccountID >= ?) AND type = 'DE'"
我看到一篇文章,它似乎表明这是可行的,至少在T-SQL中是如此。考虑到这一点,我倾向于假设它与Access一起工作。正如上面所说的,记住要包括括号
无论如何,参数只能在
WHERE
子句中是绝对不正确的。你可以在SELECT
,甚至是ORDER BY
中使用它们,我得到的可能重复的“SELECT语句包含一个保留字或一个拼写错误或缺少的参数名,或者标点不正确。”那篇文章说在括号中包含参数:SELECT TOP(@countToFetch)t\u账户…
。这样效果更好吗?听起来不错。您可能还想在Access本身中尝试它。有时,这可以毫无理由地提供有价值的见解。当然,这很有可能只是在访问中不可行。这有点令人惊讶,但我想it和T-SQL之间在某些方面肯定存在差异。Access是否像T-SQL一样有语法图?我怀疑这将是一个确定的来源。我只是看了一下,但我只能在Office上找到更“用户友好”的页面,这些页面实际上没有说任何有用的内容。不过,我希望语法与其他参数的语法相同。我是说,这确实是一个有趣的问题。如果不查找SQL,我永远不会猜到或弄明白它需要那些括号,所以它很可能是在寻找一个完全随机的指示符。