C# - ODBC 参数起作用

Posted

技术标签:

【中文标题】C# - ODBC 参数起作用【英文标题】:C# - ODBC Parameters acting up 【发布时间】:2016-11-25 09:43:35 【问题描述】:

因此,我正在尝试更改程序的设计以防止 SQL 注入,通过将 TextBoxes 与预设字符串连接来查看 SQL 字符串是如何产生的。

我在 DB2 数据库上使用 ODBC 驱动程序。

问题是,它在某些情况下有效,而在其他情况下则无效。

让我举个例子:

旧代码:

App.Comando.CommandText = "SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = '" + txt_usuario.Text + "' AND PASUSU = '" + txt_password.Password + "'";

新代码:

App.Comando.CommandText =
            "SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = ? AND PASUSU = ?";
        App.Comando.Parameters.AddWithValue("@codusu", txt_usuario.Text);
        App.Comando.Parameters.AddWithValue("@pass", txt_password.Password);

这个效果很好。

但是,这个,没有。不会抛出任何错误,只是看起来空空如也。

旧代码:

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = '" + marca + "'";

新代码:

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = ?";
App.Comando.Parameters.AddWithValue("@marca", marca);

以备不时之需,

string marca = txt_marca.Text.Trim().ToUpper();

在这种情况下,新代码不起作用,旧代码起作用。我一直在拔头发,这毫无意义。

感谢您的宝贵时间!

【问题讨论】:

App.Comando.Parameters.AddWithValue("@desmar", marca);? @artm 是的,marca 被预先定义为文本框的修剪顶部文本。应该提到 我的意思是在AddWithValue中使用@desmar而不是@marca @artm 并不重要,它只是一个名称。 ODBC 不接受文本查询中的命名参数。另外,如果您查看第一个,密码在数据库中称为 pass in param 和 PASUSU。它仍然有效。不过我会试一试,因为你永远不会知道 C#。干杯。 不起作用的情况下,FROM子句的内容不同;旧代码:DB.Marcas;新代码:META3.MARCAS。这是故意的吗? 【参考方案1】:

你设置好命令的类型了吗?

App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = ?";
App.Comando.Parameters.AddWithValue("?marca", marca);

【讨论】:

第一个没有改变任何东西,第二个给了我一个 ODBC 异常,因为 ODBC 不接受文本命令中的命名参数,只接受存储过程。不过,谢谢。 我已经修改了我的回复。 那不是存储过程。存储过程存储在数据库中,可以从代码中调用。 我已经修改了我的回复(再次;)) 也试过了,不幸的是,AddWithValue 的第一个参数基本上被忽略了,所以你放在那里的任何文本都没有任何效果。不过,谢谢。

以上是关于C# - ODBC 参数起作用的主要内容,如果未能解决你的问题,请参考以下文章

odbc_execute 参数不起作用(空警告)

php pdo & iSeriesAccess ODBC - 使用 OUT 参数调用存储过程不起作用

通过 ODBC 访问 - Oracle DEFAULT 不起作用

Discord:命令参数中的撇号在 C# 中不起作用

C# FindWindowEx 通过 WinSpy++ 获取 lpszClass 变量的参数不起作用

Crystal Report 的 ODBC 连接报告在其他机器上不起作用