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 参数起作用的主要内容,如果未能解决你的问题,请参考以下文章
php pdo & iSeriesAccess ODBC - 使用 OUT 参数调用存储过程不起作用
通过 ODBC 访问 - Oracle DEFAULT 不起作用