Почему мой ODBC SelectCommand обрезается при добавлении параметра - PullRequest
1 голос
/ 24 февраля 2010

Я использую соединение ODBC для получения набора данных в C #. Я вижу, что полная командная строка добавляется к соединению при его создании.

OdbcDataAdapter dataAdapter = new OdbcDataAdapter(GetCommandString(), odbcConnection);

Я использую следующую строку для добавления параметра в командную строку.

dataAdapter.SelectCommand.Parameters.Add("@Foo", OdbcType.Decimal).Value = foo2;

Тем не менее, при использовании SQL Profiler я вижу, что только часть командной строки фактически превращается в SQL.

Во время тестирования мы видели, что полная строка будет передана, если мы жестко закодируем значение в строку и удалим строку параметров, показанную выше.

Ограничивает ли использование параметра длину строки, которую я могу передать?

Отредактировано - добавление информации о запросе SQL: Вот пример того, как выглядит запрос до добавления параметра.

DECLARE @foo decimal
SET @foo = ?
Select c1,c2,c3,c4 from table1 where id = @foo
Select b1,b2,b3,b4 from table1 where id = @foo
Select a1,a2,a3,a4 from table1 where id = @foo
Select t1,t2,t3,t4 from table1 where id = @foo

Ответы [ 4 ]

0 голосов
/ 09 июня 2010

Я согласен с остальными, что синтаксис @Foo может быть неправильным.Если ваш OdbcDriver понимает @Foo как параметр, он не будет учитывать его имя, и это может привести к неправильному написанию запросов. Предположим, на этот раз вы пытаетесь повторно использовать параметр (другие ваши «рабочие» запросы невключите это требование)

SELECT * ИЗ таблицы, ГДЕ col = @Foo или col2 = @ Foo

В Odbc либо не будет работать, либо автоматически станет эквивалентным:

SELECT *ИЗ таблицы ГДЕ col =?или col2 =?

Вы должны будете добавить значения параметров для обоих параметров, вы не можете просто добавить один параметр с именем "@Foo" и заставить Odbc повторно использовать это значение. Кроме того, ваши параметры не имеют значениявызывается только для того, чтобы вы добавили их в правильном порядке:

cmd.Parameters.AddWithValue("col1Val", "foo")
cmd.Parameters.AddWithValue("column two value", "foo")

Имя, которое вы даете параметрам, исключительно удобно для их повторного использования;водитель не заботится о том, что они называют

Переключиться на?Синтаксис и посмотреть, если ваша проблема сохраняется

0 голосов
/ 24 февраля 2010

Вы устанавливаете масштаб и точность?

А что вы подразумеваете под усечением? Вы получаете это ...

SELECT * FROM myTable WHERE decCol = 123

когда вы ожидаете

SELECT * FROM myTable WHERE decCol = 123.456

или

SELECT * FROM myTable WHERE decCol = 123.456 AND OtherCol = 'bar'

Кроме того, профилировщик будет захватывать весь текст запроса. Что заставляет меня спросить, если вы можете использовать SQL Profiler, почему вы используете ODBC?

0 голосов
/ 24 февраля 2010

Из того, что вы показали, похоже, что вы на правильном пути, но "@Foo", вероятно, неправильный синтаксис, но я не могу сказать, не увидев фактического вывода из GetCommandString(). Синтаксис ODBC:

int foo2 = 5;
OdbcDataAdapter dataAdapter = new OdbcDataAdapter("SELECT * FROM Bar WHERE Foo = ?", odbcConnection);
dataAdapter.SelectCommand.Parameters.Add("Foo", OdbcType.Decimal).Value = foo2;

http://msdn.microsoft.com/en-us/library/zxdcah9t.aspx

0 голосов
/ 24 февраля 2010

Является ли "@Foo" правильным синтаксисом для параметров, использующих OdbcCommand? ODBC обрабатывает параметры иначе, чем ADO.NET. В ODBC параметры связаны положением, а все параметры используют заполнитель '?' в заявлении.

Я не уверен, что OdbcCommand выполняет какой-либо перевод между именованными и позиционными параметрами. Возможно, это так и не удается успешно перестроить команду.

Кроме того, если вы подключаетесь только к SQL Server, рассмотрите возможность использования SqlClient.

...