2010-02-24 62 views
1

我正在使用ODBC连接来检索C#中的数据集。我可以看到完整的命令字符串在创建时被添加到连接中。为什么添加参数时,我的ODBC SelectCommand会被截断

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

我正在使用以下行将参数添加到命令字符串中。

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

然而,使用SQL事件探查时,我可以看到,只有命令字符串的一部分,实际上它对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 
+0

这是一个关于代码失败的参数的问题,或者只是不能在SQL Profiler中看到完整的查询文本? – 2010-02-24 17:18:01

+0

您使用ODBC连接连接的数据库类型是什么?正如另一种说法所述,@ foo可能不被允许作为命名参数,因为可能在其他连接(如SQLAdapter)中可用。 – DRapp 2010-05-04 12:22:58

回答

0

“@Foo”是使用OdbcCommand的参数的正确语法吗? ODBC对待参数的方式不同于ADO.NET。在ODBC中,参数是按位置绑定的,所有参数都使用占位符'?'在声明中。

我不确定OdbcCommand是否在命名参数和位置参数之间做了一些转换。也许它确实,并且它没有成功地重建命令。

此外,如果您只连接到SQL Server考虑只使用SqlClient。

+0

我很确定@Foo是正确的我以前在使用这个项目时使用过类似的语法。我发布了一个上面查询的例子。我会试着研究如何重建查询。感谢您的建议。 – 2010-02-24 19:42:56

0

您是否正在设置scale和精度?

你是什么意思的截断?你当你想到

SELECT * FROM myTable WHERE decCol = 123.456 

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

同样得到这个...

SELECT * FROM myTable WHERE decCol = 123 

,分析器将捕捉整个查询文本。这导致我问,如果你可以使用SQL分析器为什么你使用ODBC?

+0

更接近您列出的第二个示例。我期待看到大约20个选择语句通过,但只有5个正在通过。是的,ODBC可能不是最佳解决方案。不幸的是,该项目实际上受限于基于现有客户设置的使用。 – 2010-02-24 19:49:30

0

从您所看到的看起来您正处于正确的轨道上,但"@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

我发布了上面的查询示例。我相当肯定@Foo语法是正确的。我以前曾以类似的方式使用过odbc参数。 – 2010-02-24 19:45:21

0

我与其他人同意,该@foo语法可能不正确。如果您的OdbcDriver将@Foo理解为参数,它将不会听从它的名称,这可能会导致您以破碎的方式编写查询。假设这个时候youre设法重用一个参数(你的其他“工作”查询不配备此要求)

SELECT * FROM表WHERE列= @foo或COL2 = @foo

在ODBC要么不工作或默默等同于:

SELECT * FROM table WHERE col =?或col2 =?

您必须为两个参数添加参数值,您不能只添加一个名为“@Foo”的参数并让Odbc重用该值。此外,重要的不是您的参数被调用,而只是添加他们以正确的顺序排列:

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

您给参数的名称只是为了方便您重用它们;司机不在乎他们叫什么

切换到?语法,看看你的问题是否仍然存在

相关问题