c#
  • sql
  • db2
  • odbc
  • 2016-11-25 56 views 0 likes 
    0

    所以,我试图改变我的程序的设计,以防止SQL注入,看到老SQL字符串是如何通过预设的字符串串联文本框制成。C# - ODBC参数演戏

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

    事情是,它工作在某些情况下,在别人少了点。

    让我给你举个例子:

    旧代码:

    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(); 
    

    在这种情况下,新的代码不能正常工作,旧的那个。我一直在拉我的头发,这没有意义。

    谢谢你的时间!

    +0

    'App.Comando.Parameters.AddWithValue(“@ desmar”,marca);'? – artm

    +0

    @artm是的,marca事先被定义为文本框的修剪后的toupper文本。应该提到 –

    +0

    我想在'AddWithValue'中使用'@ desmar'而不是'@ marca' – artm

    回答

    0

    有你的一套命令的类型?

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

    第一个不会改变任何东西,第二个会给我一个ODBC异常,因为ODBC不接受文本命令中的命名参数,仅在存储过程中。不过谢谢你。 –

    +0

    我修改了我的回复。 – Esperento57

    +0

    这不是一个存储过程。存储过程存储在数据库中,可以从代码中调用。 –

    相关问题