我有一个Web应用程序,页面上有一个更新页面来更新一些配置文件信息。下面是我用来更新表的代码。但我认为这是错误的。有什么突出的吗?连接字符串有效,因为它用于读取数据库以获取配置文件信息,我刚删除它,因为它包含数据库的密码/登录信息。
播放器是包含播放器信息的属性类,ds是数据集,但我想在线更新数据库...
Dim connectionString As String = ""
Dim GigsterDBConnection As New System.Data.SqlClient.SqlConnection(connectionString)
GigsterDBConnection.Open()
Dim updatetoursql As String = "UPDATE PLAYERS SET FIRSTNAME = '" & player.FIRSTNAME & "', LASTNAME = '" & player.LASTNAME & "', ADDRESS = '" & player.ADDRESS & "', CITY = '" & player.CITY & "', ZIP = '" & player.ZIP & "', PHONE = '" & player.PHONE & "', EMAIL = '" & player.EMAIL & "', REFFEREDBY = '" & player.REFEREDBY & "' "
updatetoursql = updatetoursql & "PLAYERID = '" & player.PLAYERID & "';"
Dim cmd As New System.Data.SqlClient.SqlCommand(updatetoursql, GigsterDBConnection)
Dim sqlAdapter As New System.Data.SqlClient.SqlDataAdapter(cmd)
sqlAdapter.Update(ds, "PLAYERS")
我认为问题是代码的最后三行。我做得对还是他们更好的方式?
由于
答案 0 :(得分:2)
嗯,除了明显的SQL注入问题等着你......(提示:使用参数化查询而不是将你的SQL语句连接在一起!!)
Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)
Dim sqlAdapter As New SqlDataAdapter(cmd)
这里的问题是:如果以这种方式调用SqlDataAdapter构造函数,那么传入的是 select 命令(数据适配器) - 而不是更新命令!
你需要这样做:
Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)
Dim sqlAdapter As New SqlDataAdapter()
sqlAdapter.UpdateCommand = cmd;
现在,您已将UPDATE
语句与SqlDataAdapter.UpdateCommand
相关联,现在它应该有效。
关于SQL注入:我强烈建议始终使用参数化查询 - 至少在生产代码中。因此,不要将查询连接在一起,请使用:
Dim updatetoursql As String =
"UPDATE PLAYERS SET FIRSTNAME = @FirstName, LASTNAME = @LastName, " &
"ADDRESS = @Address, CITY = @City, ZIP = @Zip, PHONE = @Phone " &
"EMAIL = @EMail, REFFEREDBY = @ReferredBy, PLAYERID = @PlayerID"
然后在执行命令或SqlDataAdapter.Update
语句之前,将这些参数设置为您拥有的值。这样更安全,可以减少头痛,甚至可以提高速度(如果单个Update查询只在SQL Server内存中缓存一次)。
另外,为什么要采用SqlDataAdapter
的漫长而复杂的方式?
创建SqlCommand
并设置所有参数后,只需致电cmd.ExecuteNonQuery();
即可完成!
Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)
// set up the parameters here.....
cmd.Parameters.AddWithvalue("@FirstName", FirstName);
... etc.
// just call ExecuteNonQuery - and you're done!
cmd.ExecuteNonQuery();
答案 1 :(得分:1)
对我而言,最重要的一点是对这段代码的SQL Injection攻击有多开放。
您不应该以这种方式构建SQL字符串,而是使用parameterized queries。
除此之外,您正在错误地构造适配器,因为构造函数将执行 select 命令,而不是update命令。使用无参数构造函数创建命令,然后将您创建的命令分配给UpdateCommand
属性。