Можно ли использовать параметры OleDBCommand в другом месте, кроме предложения Where?

1

У меня есть этот код:

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);

... но интересно, могу ли я использовать параметр для верхнего подсчета, например:

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?

ОБНОВИТЬ

С помощью этого кода:

  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

Эта:

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'"

... в 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'"
Теги:
ms-access-2007
ms-access
oledbcommand

1 ответ

1
Лучший ответ

Я столкнулся с этим сообщением, которое, похоже, указывает на то, что это работает, по крайней мере, с T-SQL. Я склонен предположить, учитывая, что он работает с Access. Просто, как говорится, не забудьте включить круглые скобки.

В любом случае, определенно неверно, что параметры могут быть только в WHERE. Вы можете использовать их в SELECT или даже ORDER BY.

  • 0
    Я получил: «Оператор SELECT содержит зарезервированное слово или имя аргумента, которое написано с ошибкой или отсутствует, или пунктуация неверна».
  • 1
    В этом посте сказано, что параметр должен быть включен в скобки: SELECT TOP (@countToFetch) t_accounts... Это работает лучше вообще?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню