У меня есть этот код:
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);
Эта:
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, который заканчивается созданием этого запроса.
Я также пробовал это, как в обновлении 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 TOP (@countToFetch) t_accounts...
Это работает лучше вообще?