Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在添加参数时ODBC SelectCommand会被截断_C#_Sql_Parameters_Odbc - Fatal编程技术网

C# 为什么在添加参数时ODBC SelectCommand会被截断

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事件

我正在使用ODBC连接检索C中的数据集。我可以看到,在创建连接时,完整的命令字符串已添加到连接中

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