Web表单不更新表,为什么?

时间:2010-04-11 13:37:42

标签: asp.net sql vb.net tabs

我有一个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")

我认为问题是代码的最后三行。我做得对还是他们更好的方式?

由于

2 个答案:

答案 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属性。