Sql 如果存在,请更新。否则请插入。连接超时错误
我的代码的问题是我可以正确地插入到数据库中,但如果它将更新,则 连接超时。因此,为了澄清我的问题,我的插入代码可以工作,但更新不能 这是我的密码:Sql 如果存在,请更新。否则请插入。连接超时错误,sql,asp.net,vb.net,insert,Sql,Asp.net,Vb.net,Insert,我的代码的问题是我可以正确地插入到数据库中,但如果它将更新,则 连接超时。因此,为了澄清我的问题,我的插入代码可以工作,但更新不能 这是我的密码: Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click Dim strConnString As String = DataSource.ConnectionString Using con As New SqlCon
Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Dim strConnString As String = DataSource.ConnectionString
Using con As New SqlConnection(strConnString)
Using cmd As New SqlCommand()
Dim base64String = TextArea1.Value
Dim imageBytes As Byte() = Convert.FromBase64String(base64String)
Dim ImageTypeDataOfImage As New SqlParameter("@Data", SqlDbType.Image)
ImageTypeDataOfImage.Value = imageBytes
Dim SQLStr As String
SQLStr = " IF EXISTS (SELECT * FROM [Patient_Data].[dbo].[tbPatientImage] where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "') " & _
" UPDATE [Patient_Data].[dbo].[tbPatientImage] SET PatImage= @Data where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "' " & _
" else INSERT INTO [Patient_Data].[dbo].[tbPatientImage](HospNum,IDNum, DoctorID, PatImage , FileType, FileName, TransDATE) VALUES ('" & Session.Item("HospNum") & "','" & Session.Item("IDNum") & "', '" & Session.Item("DoctorID") & "', @Data, '" & lblHeader.Text & "', 'PatientPhoto' , GETDATE()) "
cmd.CommandText = SQLStr
cmd.Parameters.Add(ImageTypeDataOfImage)
cmd.Connection = con
con.Open()
cmd.ExecuteNonQuery()
con.Close()
End Using
End Using
End Sub
看起来您没有
COMMIT
ing或ROLLBACK
ing您的事务
Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Dim strConnString As String = DataSource.ConnectionString
Using con As New SqlConnection(strConnString)
Using cmd As New SqlCommand()
Dim base64String = TextArea1.Value
Dim imageBytes As Byte() = Convert.FromBase64String(base64String)
Dim ImageTypeDataOfImage As New SqlParameter("@Data", SqlDbType.Image)
ImageTypeDataOfImage.Value = imageBytes
Dim transaction As SqlTransaction
transaction = con.BeginTransaction("MyTransaction");
Dim SQLStr As String
SQLStr = " IF EXISTS (SELECT * FROM [Patient_Data].[dbo].[tbPatientImage] where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "') " & _
" UPDATE [Patient_Data].[dbo].[tbPatientImage] SET PatImage= @Data where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "' " & _
" else INSERT INTO [Patient_Data].[dbo].[tbPatientImage]
(HospNum,IDNum, DoctorID, PatImage , FileType, FileName, TransDATE) VALUES ('" & Session.Item("HospNum") & "','" & Session.Item("IDNum") & "', '" & Session.Item("DoctorID") & "', @Data, '" & lblHeader.Text & "', 'PatientPhoto' , GETDATE()) "
cmd.CommandText = SQLStr
cmd.Parameters.Add(ImageTypeDataOfImage)
cmd.Connection = con
cmd.Transaction = transaction
con.Open()
cmd.ExecuteNonQuery()
transaction.Commit()
con.Close()
End Using
End Using
End Sub
这意味着,您的上一个会话仍然保持对行的锁定,您尝试更新,尽管您关闭了连接。因此,下一次,当接收到同一记录的更新时,数据库会识别出,有另一个会话在该记录上持有锁,因此除非该记录被释放,否则无法对其执行更多的更新或删除。。而且,这会无限期地等待,导致你超时
鉴于,每个插入项都将是一个新条目,因此是前一个条目。行级锁不会影响它们。在关闭连接之前,在DBA的帮助下,尝试终止所有这些会话,并在代码中包含COMMIT
有一些示例演示如何提交事务
Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Dim strConnString As String = DataSource.ConnectionString
Using con As New SqlConnection(strConnString)
Using cmd As New SqlCommand()
Dim base64String = TextArea1.Value
Dim imageBytes As Byte() = Convert.FromBase64String(base64String)
Dim ImageTypeDataOfImage As New SqlParameter("@Data", SqlDbType.Image)
ImageTypeDataOfImage.Value = imageBytes
Dim transaction As SqlTransaction
transaction = con.BeginTransaction("MyTransaction");
Dim SQLStr As String
SQLStr = " IF EXISTS (SELECT * FROM [Patient_Data].[dbo].[tbPatientImage] where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "') " & _
" UPDATE [Patient_Data].[dbo].[tbPatientImage] SET PatImage= @Data where HospNum='" & Session.Item("HospNum") & "' and IDNum='" & Session.Item("IDNum") & "' and FileType= '" & lblHeader.Text & "' " & _
" else INSERT INTO [Patient_Data].[dbo].[tbPatientImage]
(HospNum,IDNum, DoctorID, PatImage , FileType, FileName, TransDATE) VALUES ('" & Session.Item("HospNum") & "','" & Session.Item("IDNum") & "', '" & Session.Item("DoctorID") & "', @Data, '" & lblHeader.Text & "', 'PatientPhoto' , GETDATE()) "
cmd.CommandText = SQLStr
cmd.Parameters.Add(ImageTypeDataOfImage)
cmd.Connection = con
cmd.Transaction = transaction
con.Open()
cmd.ExecuteNonQuery()
transaction.Commit()
con.Close()
End Using
End Using
End Sub
这一排有一把锁?你说有锁是什么意思?请解释一下我有点新。这看起来容易受到SQL注入的攻击。谢谢你的回复。先生,你有这个的代码样本吗?我将使用sqltransaction.commit?我添加了文档参考。请核对一下。你好。我在放置代码时遇到问题。您能编辑我的代码并粘贴到这里吗?我已经将您的代码添加到我的代码中,但是错误连接超时仍然发生。必须删除现有的锁。。希望这有帮助。我们的新代码,只是避免了未来的锁。