我在.NET中使用后端的SQL服务器
我有一个数据库,我使用Web控件创建记录 - 然后我需要更新一些字段 我可以捕获sql语句并在sql server中成功运行它 - 但是,当我尝试运行execute non-query时,我收到以下错误:
未处理的执行错误 '<'附近的语法不正确。 在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection) 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 在System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async) 在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,String methodName,Boolean sendToPipe) 在System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在D:\ Webs \ Internal \ veritythree.com \ SupportBeta \ TestAPI.ascx.vb中的TestAPI.UpdateTicketValues(String srId):第216行 在D:\ Webs \ Internal \ veritythree.com \ SupportBeta \ TestAPI.ascx.vb中的TestAPI.Submit_Click(Object sender,EventArgs e):第170行 在System.Web.UI.WebControls.Button.OnClick(EventArgs e) 在System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 在System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 在System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument) 在System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 在System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)0.517567748943243 0.511543
这是我的功能:
Public Function UpdateTicketValues(ByVal srId As String) As Boolean
Dim result As Boolean
Dim myCDataReader As System.Data.SqlClient.SqlDataReader
Dim myUConn As New System.Data.SqlClient.SqlConnection
Dim myCCmd As New System.Data.SqlClient.SqlCommand
Dim myUCmd As New System.Data.SqlClient.SqlCommand
Dim strSQL As String
strSQL = "SELECT Contact_RecId, First_Name, Last_Name, PhoneNbr, Extension, Email FROM vti_ContactInformation " & _
"WHERE Company_RecId = " & CoId & " AND Email = '" & txtEmail.Text & "'"
myCConn.Open()
myUConn = New System.Data.SqlClient.SqlConnection("Data Source=x;Initial Catalog=x;User Id=x;Password=x;Trusted_Connection=False")
myUConn.Open()
myCCmd.Connection = myCConn
myCCmd.CommandText = strSQL
myCDataReader = myCCmd.ExecuteReader
If myCDataReader.Read() Then
'Run update with contact information
strSQL = "UPDATE SR_Service " & _
"SET Contact_RecId = " & myCDataReader.GetValue(0) & ", " & _
" Contact_Name = '" & myCDataReader.GetValue(1) & " " & myCDataReader.GetValue(2) & "', " & _
" PhoneNbr = '" & myCDataReader.GetValue(3) & "', " & _
" Extension = '" & myCDataReader.GetValue(4) & "', " & _
" Email_Address = '" & myCDataReader.GetValue(5) & "' " & _
"WHERE SR_Service_RecId = " & srId & " "
myUCmd.Connection = myUConn
myUCmd.CommandText = strSQL
'myCCmd.ExecuteNonQuery()
lblServiceRequest.Text = myUCmd.CommandText
result = True
Else
myUCmd.CommandText = ""
result = False
End If
If myUCmd.CommandText <> "" Then
myUCmd.ExecuteNonQuery()
End If
myCConn.Close()
myUConn.Close()
Return result
End Function
感谢任何帮助!
答案 0 :(得分:7)
在我看到错误可能出现的地方之前我建议你立即停止做什么,并首先更改所有sql代码以使用参数。如果你不这样做,你的网站将会对sql注入攻击开放,这可能会破坏你的数据库。
找出运行问题的位置,然后检查stmt:starting和stmt:completed事件。
答案 1 :(得分:2)
我对此的看法是在执行命令之前中断。 debug.print命令文本,切换到sql查询分析器并在那里粘贴sql-string并运行。然后你会看到问题究竟是什么,如果它在命令中。
我认为你有值逃脱sql-string并且包含'&lt;什么的。
答案 2 :(得分:1)
除了上述与SQL Injection相关的其他答案外,您还需要查看:
... " & CoId & " ...
... " & myCDataReader.GetValue(0) & " ...
... " & srId & " ...
这些陈述不会被转义,因此很有可能出现错误。
答案 3 :(得分:1)
最有可能的是,将此代码转换为参数化查询(最有可能修复流程中的错误)所需的时间少于追踪问题的时间。不再有SQL注入的风险,更容易阅读并且您获得执行计划。赢得胜利!
您可以轻松地连接这样的字符串,这是避免以这种方式执行SQL的另一个原因。
答案 4 :(得分:1)
您确定错误是在UPDATE语句中吗? 我认为它在SELECT语句中,正如我从您的stacktrace中看到的那样。为什么不在该语句中使用参数?
接下来,您可以更有效地编写代码。 现在,您执行SELECT语句,并对结果集中的每个记录执行UPDATE查询。 知道SQL是基于设置的,并且可以用一个语句编写。
类似的东西:
UPDATE sr_service
SET contact_name = vti_ContactInformation.FirstName + ' ' + vti_ContactInformation.LastName
... your other columns ..
FROM vti_ContactInformation
WHERE sr_service.sr_service_recid = {yourid}
确保使用相应的列替换{yourid}。 我还没有这样做,因为我无法直接看到你为srId变量分配的值。
答案 5 :(得分:0)
首先要做的事情;设置为停止异常(这样你可以看到它是哪个非查询) - 然后你就能看到出错的命令文本。
我还建议将这些查询转换为存储过程(或至少是参数化查询);不仅仅是为了从执行计划中获得性能提升,而且从安全角度来看(考虑当txtEmail.Text为“'时会发生什么?'drop table vti_ContactInformation; select'”
答案 6 :(得分:0)
谢谢大家 - 当我将所有内容更改为参数时,我发现srId变量中的值有一些隐藏文本(某些xml标记剩余部分)。一旦我理顺了它,它就完美了。
感谢指点和良好的指导!