C# 为什么在添加参数时ODBC SelectCommand会被截断
我正在使用ODBC连接检索C中的数据集。我可以看到,在创建连接时,完整的命令字符串已添加到连接中C# 为什么在添加参数时ODBC SelectCommand会被截断,c#,sql,parameters,odbc,C#,Sql,Parameters,Odbc,我正在使用ODBC连接检索C中的数据集。我可以看到,在创建连接时,完整的命令字符串已添加到连接中 OdbcDataAdapter dataAdapter = new OdbcDataAdapter(GetCommandString(), odbcConnection); 我使用下面的行将参数添加到命令字符串中 dataAdapter.SelectCommand.Parameters.Add("@Foo", OdbcType.Decimal).Value = foo2; 然而,当使用SQL事件
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
@Foo是使用odbc命令的参数的正确语法吗?ODBC对待参数的方式不同于ADO.NET。在ODBC中,参数由位置绑定,所有参数都使用语句中的占位符“?” 我不确定OdbcCommand是否在命名参数和位置参数之间进行转换。也许是这样,但它无法成功地重建命令
此外,如果您只连接SQLServer,只考虑使用SQLClient .< /P> < P>,您是否设置和精度?
你说的截断是什么意思?你知道这个吗SELECT * FROM myTable WHERE decCol = 123
当你期待
SELECT * FROM myTable WHERE decCol = 123.456
或
此外,分析器将捕获整个查询文本。这让我想问,如果你能使用SQL profiler,为什么要使用ODBC?从你所展示的内容来看,你似乎走对了方向,但是@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;
我同意其他人的观点,@Foo语法可能不正确。如果您的OdbcDriver将@Foo理解为一个参数,那么它就不会注意它的名称,这可能会导致您以错误的方式编写查询。。假设这次您尝试重用一个参数,您的其他工作查询不满足此要求 从col=@Foo或col2=@Foo的表中选择* 在Odbc中,将不起作用或静默变为等同于: 从col=?或者col2= 您必须为两个参数添加参数值,不能只添加一个名为@Foo的参数并让Odbc重用该值。。此外,参数的调用并不重要,重要的是按正确的顺序添加它们:
cmd.Parameters.AddWithValue("col1Val", "foo")
cmd.Parameters.AddWithValue("column two value", "foo")
您为参数指定的名称只是为了方便您重用它们;司机不在乎他们叫什么
切换到?语法并查看您的问题是否仍然存在这是一个关于代码参数失败的问题还是无法在SQL Profiler中查看完整查询文本的问题?您使用ODBC连接连接到哪种类型的数据库?正如另一个人所说,@foo可能不被允许作为命名参数,因为它可能在其他连接(如SQLAdapter)中可用。我发布了一个上面查询的示例。我将尝试研究如何重建查询。谢谢你的建议。我在上面贴了一个查询的例子。我相当肯定@Foo语法是正确的。我以前也以类似的方式使用过odbc参数。更接近您列出的第二个示例。我希望看到大约20条select语句通过,但只有5条通过。是的,ODBC可能不是最佳解决方案。不幸的是,基于现有的客户端设置,该项目实际上仅限于其使用。
cmd.Parameters.AddWithValue("col1Val", "foo")
cmd.Parameters.AddWithValue("column two value", "foo")