Asp.net sql update命令的vb.net问题
我正在寻找一些帮助,试图找出为什么我在vb.net中的更新命令上看到SQL错误,注意到我的SQL经验非常有限 我正在构建一个配置文件系统,该系统将在我们公司的其他几个工具中使用,作为配置文件系统的一部分,在页面加载时根据LDAP目录查询用户信息,并在页面标签中显示存储在变量中的数据 然后,用户可以选择创建新的配置文件(如果不存在),或者更新现有的配置文件(如果已经存在)。该代码基于使用用户员工id查询表来确定正确的操作 我的insert命令工作正常,但更新没有,下面是我的当前代码和错误 这是用于创建新条目的insert语句,可以正常工作Asp.net sql update命令的vb.net问题,asp.net,sql,vb.net,Asp.net,Sql,Vb.net,我正在寻找一些帮助,试图找出为什么我在vb.net中的更新命令上看到SQL错误,注意到我的SQL经验非常有限 我正在构建一个配置文件系统,该系统将在我们公司的其他几个工具中使用,作为配置文件系统的一部分,在页面加载时根据LDAP目录查询用户信息,并在页面标签中显示存储在变量中的数据 然后,用户可以选择创建新的配置文件(如果不存在),或者更新现有的配置文件(如果已经存在)。该代码基于使用用户员工id查询表来确定正确的操作 我的insert命令工作正常,但更新没有,下面是我的当前代码和错误 这是用于
Protected Sub btnInsert_Click(sender As Object, e As EventArgs) Handles btnInsert.Click
Try
Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString = "Data Source="server" Catalog=usertable;Integrated Security=True"
con.Open()
cmd.Connection = con
cmd.CommandText = "INSERT INTO Profile (FirstName, LastName, Email, Telephone, EmployeeID, NTLogin) VALUES ('" & lblFirstName.Text & "','" & lblLastName.Text & "','" & lblEmail.Text & "','" & lblPhone.Text & "','" & lblEID.Text & "','" & lblNT.Text & "')"
cmd.ExecuteNonQuery()
btnInsert.Enabled = False
lblValid.Text = "Record Inserted Successfully"
con.Close()
Catch ex As System.Exception
lblValid.Text = (ex.Message)
End Try
以下是给出错误的更新代码:
Protected Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Try
Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString = "server;Initial Catalog=usertable;Integrated Security=True"
con.Open()
cmd.Connection = con
cmd.CommandText = "UPDATE Profile (FirstName, LastName, Email, Telephone, EmployeeID, NTLogin) VALUES ('" & lblFirstName.Text & "','" & lblLastName.Text & "','" & lblEmail.Text & "','" & lblPhone.Text & "','" & lblEID.Text & "','" & lblNT.Text & "') Where [EmployeeID] = '" & lblEID.text & "'"
cmd.ExecuteNonQuery()
btnUpdate.Enabled = False
lblValid.Text = "Record Updated Successfully"
con.Close()
Catch ex As System.Exception
lblValid.Text = (ex.Message)
End Try
End Sub
返回的异常错误为
[SqlException (0x80131904): Incorrect syntax near '('.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +392
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +815
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4515
System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) +1390
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +538
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +290
newprofile.btnUpdate_Click(Object sender, EventArgs e) +759
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +155
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3804
我不知所措,非常感谢您的帮助。更新语法完全无效,正如@JBKing所说 更新语句的形式如下:
UPDATE myTableName SET field=new_value WHERE condition=some_value
另外,为了避免可能的注入,不要将字段值直接传递到SQL命令中。如@JBKing所述,使用参数更新语法完全无效 更新语句的形式如下:
UPDATE myTableName SET field=new_value WHERE condition=some_value
另外,为了避免可能的注入,不要将字段值直接传递到SQL命令中。使用参数
应该是这样的:
cmd.CommandText = "UPDATE Profile SET FirstName='"&lblFirstName.Text&"', LastName='"&lblLastName.Text&"', Email='"&lblEmail.Text&"', Telephone='"&lblPhone.Text&"', EmployeeID='"&lblEID.Text&"', NTLogin='"&lblNT.Text&"' Where [EmployeeID] = '" & lblEID.text & "'"
对于像O'Connor这样的姓氏,我会很小心,因为在大多数情况下,存储过程或参数是防止SQL注入攻击的首选,这是有原因的
应该是这样的:
cmd.CommandText = "UPDATE Profile SET FirstName='"&lblFirstName.Text&"', LastName='"&lblLastName.Text&"', Email='"&lblEmail.Text&"', Telephone='"&lblPhone.Text&"', EmployeeID='"&lblEID.Text&"', NTLogin='"&lblNT.Text&"' Where [EmployeeID] = '" & lblEID.text & "'"
对于像O'Connor这样的姓氏,我会小心,因为在大多数情况下,存储过程或参数是首选的,以防止SQL注入攻击,这是有原因的。感谢所有提供帮助的人。在共享的示例和链接之间,我能够重建我的命令,使其正确更新,并且现在使用参数化查询而不是直接insert语句(或者至少是我认为正确的语句)进行设置,并且运行正常 下面是我的最终代码
Try
Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString = "Data Source=server;Initial Catalog=database;Integrated Security=True"
con.Open()
cmd.Connection = con
cmd.CommandText = ("UPDATE Profile SET FirstName = @FirstName, LastName = @LastName, Email = @Email, Telephone = @Telephone, EmployeeID = @EmployeeID, NTLogin = @NTLogin, Organization = @Organization, Permission = @Permission Where [EmployeeID] = '" & eID & "'")
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = lblFirstName.Text
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = lblLastName.Text
cmd.Parameters.Add("@Email", SqlDbType.VarChar).Value = lblEmail.Text
cmd.Parameters.Add("@Telephone", SqlDbType.VarChar).Value = lblPhone.Text
cmd.Parameters.Add("@EmployeeID", SqlDbType.VarChar).Value = lblEID.Text
cmd.Parameters.Add("@NTLogin", SqlDbType.VarChar).Value = lblNT.Text
cmd.Parameters.Add("@Organization", SqlDbType.VarChar).Value = lblOrg.Text
cmd.Parameters.Add("@Permission", SqlDbType.VarChar).Value = "requestor"
cmd.ExecuteNonQuery()
con.close
lblValid.Text = "Record Updated Successfully"
Catch ex As System.Exception
lblValid.Text = (ex.Message)
End Try
谢谢 感谢所有提供帮助的人。在共享的示例和链接之间,我能够重建我的命令,使其正确更新,并且现在使用参数化查询而不是直接insert语句(或者至少是我认为正确的语句)进行设置,并且运行正常 下面是我的最终代码
Try
Dim con As New SqlConnection
Dim cmd As New SqlCommand
con.ConnectionString = "Data Source=server;Initial Catalog=database;Integrated Security=True"
con.Open()
cmd.Connection = con
cmd.CommandText = ("UPDATE Profile SET FirstName = @FirstName, LastName = @LastName, Email = @Email, Telephone = @Telephone, EmployeeID = @EmployeeID, NTLogin = @NTLogin, Organization = @Organization, Permission = @Permission Where [EmployeeID] = '" & eID & "'")
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = lblFirstName.Text
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = lblLastName.Text
cmd.Parameters.Add("@Email", SqlDbType.VarChar).Value = lblEmail.Text
cmd.Parameters.Add("@Telephone", SqlDbType.VarChar).Value = lblPhone.Text
cmd.Parameters.Add("@EmployeeID", SqlDbType.VarChar).Value = lblEID.Text
cmd.Parameters.Add("@NTLogin", SqlDbType.VarChar).Value = lblNT.Text
cmd.Parameters.Add("@Organization", SqlDbType.VarChar).Value = lblOrg.Text
cmd.Parameters.Add("@Permission", SqlDbType.VarChar).Value = "requestor"
cmd.ExecuteNonQuery()
con.close
lblValid.Text = "Record Updated Successfully"
Catch ex As System.Exception
lblValid.Text = (ex.Message)
End Try
谢谢 更新使用不同的语法。有一些可能有用的细节。谢谢你们的指点和链接,你们给了我一些东西可以看,还有一些地方可以进一步提高我的知识,正确地做事。今晚我会花点时间把事情弄清楚。再次感谢!更新使用不同的语法。有一些可能有用的细节。谢谢你们的指点和链接,你们给了我一些东西可以看,还有一些地方可以进一步提高我的知识,正确地做事。今晚我会花点时间把事情弄清楚。再次感谢!您可以在代码中使用参数,而无需存储过程。您可以在代码中使用参数,而无需存储过程。不要太挑剔,但您应该在where语句中将employeeID作为参数传递;不要太吹毛求疵,但也应该在where语句中传递employeeID作为参数;