Sql server 多个SQL Server数据库访问
准备一个应用程序,该应用程序将由大约40名office用户使用本地网络上的本地SQL Server。在VB.NET中开发的应用程序。我已经阅读了一些文档,但我想直接从您那里获得一些关于数据访问的知识 这是一个Winforms应用程序,我想知道我正在使用的事务是否足以保护数据,例如,当一个用户使用某些数据,而另一个用户将同时更改数据时,事务是否会保护它?有人能简单地给我解释一下情况吗 我在应用程序中使用的SQL事务示例Sql server 多个SQL Server数据库访问,sql-server,vb.net,Sql Server,Vb.net,准备一个应用程序,该应用程序将由大约40名office用户使用本地网络上的本地SQL Server。在VB.NET中开发的应用程序。我已经阅读了一些文档,但我想直接从您那里获得一些关于数据访问的知识 这是一个Winforms应用程序,我想知道我正在使用的事务是否足以保护数据,例如,当一个用户使用某些数据,而另一个用户将同时更改数据时,事务是否会保护它?有人能简单地给我解释一下情况吗 我在应用程序中使用的SQL事务示例 Dim结果为布尔值=True Dim strcon=New AppSettin
Dim结果为布尔值=True
Dim strcon=New AppSettingsReader().GetValue(“ConnectionString”,GetType(String)).ToString()
将连接用作新的SqlConnection(strcon)
“--为所有查询打开generall连接
connection.Open()
“--进行交易。
Dim事务作为SqlTransaction
事务=connection.BeginTransaction(IsolationLevel.ReadCommitted)
尝试
对于pSentsId中的每个sentId
'--将aricle插入文章的表(T_Artikel),并获取插入的行id,以便在其他查询中使用它
使用cmd作为新的SqlCommand(“插入到T_SEQUENCE_SecKatSubKat_SubSubKat(FK_SEQUENCE_ID,FK_SecKatSubKat_SubSubKat)值(@FK_SEQUENCE_ID,@FK_SecKatSubKat_SubSubKat_SubSubKat)”,连接)
cmd.CommandType=CommandType.Text
cmd.Connection=Connection
cmd.Transaction=Transaction
cmd.Parameters.AddWithValue(“@FK\u语句\u ID”,sentId)
cmd.Parameters.AddWithValue(“@FK_SubSec_SecKatSubKat_SubSubKat”,SubSec_SecKatSubKat_SubSubKat”)
cmd.ExecuteScalar()
终端使用
下一个
Commit()事务
特例
结果=错误
“--回滚事务。
尝试
事务。回滚()
捕获ex2作为异常
'此catch块将处理可能发生的任何错误
'在可能导致回滚失败的服务器上,例如
“一个封闭的联系。
'Console.WriteLine(“回滚异常类型:{0}”,ex2.GetType())
'Console.WriteLine(“消息:{0}”,ex2.Message)
结束尝试
结束尝试
终端使用
返回结果
根据您的业务规则,有两个版本。A) 所有插入成功或全部失败
Dim result As Boolean = True
Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(String))'.ToString()'no need. It is already **String**
Using connection As New SqlConnection(strcon)
''//--Following 2 lines are OK
''//--Using cmd As New SqlCommand("INSERT INTO T_Sentence_SubSec_SecKatSubKat_SubSubKat (FK_Sentence_ID, FK_SubSec_SecKatSubKat_SubSubKat) VALUES (@FK_Sentence_ID, @FK_SubSec_SecKatSubKat_SubSubKat)", connection)
''//--cmd.CommandType = CommandType.Text
''//--but these two are better
Using cmd As New SqlCommand("dbo.T_Sentence_SubSec_SecKatSubKat_SubSubKat_ins ", connection)
''//-- Insert aricle to Articles table (T_Artikel) and get inserted
''//--row id to use it in other queries
cmd.CommandType = CommandType.StoredProcedure
''//-- Open generall connection for all the queries
''//--open connection in try block
''//--connection.Open()
''//-- Make the transaction.
''//--Dim transaction As SqlTransaction
''//--transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
Try
connection.Open()
cmd.Transaction = connection.BeginTransaction()
cmd.Parameters.Add("@FK_Sentence_ID", SqlDbType.Int) ''//--or whatever
cmd.Parameters.Add("@FK_SubSec_SecKatSubKat_SubSubKat", SqlDbType.Int)
For Each sentId In pSentsId
cmd.Parameters("@FK_Sentence_ID").Value = sentId
cmd.Parameters("@FK_SubSec_SecKatSubKat_SubSubKat").Value = SubSec_SecKatSubKat_SubSubKat
cmd.ExecuteNonQuery() ''//--returns rows affected. We do not use result
Next
''//--everything is OK
cmd.Transaction.Commit()
Catch ex as SqlException
result = False
''//--SqlException is more informative for this case
If cmd.Transaction IsNot Nothing
cmd.Transaction.Rollback
''//--extra try...catch if you wish
End If
Catch ex As Exception
result = False
''//-- Roll the transaction back.
Try
cmd.Transaction.Rollback()
Catch ex2 As Exception
''// This catch block will handle any errors that may have occurred
''// on the server that would cause the rollback to fail, such as
''// a closed connection.
''//Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
''//Console.WriteLine(" Message: {0}", ex2.Message)
End Try
Finally
If connection.State <> Closed
connection.Close()
End If
End Try
End Using''//cmd
End Using''//connection
Return result
Dim结果为布尔值=True
Dim strcon=New AppSettingsReader().GetValue(“ConnectionString”,GetType(String))”。ToString()不需要。它已经是**字符串了**
将连接用作新的SqlConnection(strcon)
''/--以下两行可以
''/--使用cmd作为新的SqlCommand(“插入到T_SEQUENCE_SecKatSubKat_SubSubKat(FK_SEQUENCE_ID,FK_SecKatSubKat_SubSubKat)值(@FK_SEQUENCE_ID,@FK_SecKatSubKat_SubSubKat_SubSubKat)”,连接)
''/--cmd.CommandType=CommandType.Text
''/--但这两个更好
使用cmd作为新的SqlCommand(“dbo.T_语句_SubSec_SecKatSubKat_SubSubKat_ins”,连接)
''/--将aricle插入文章表(T_Artikel)并插入
''/--在其他查询中使用它的行id
cmd.CommandType=CommandType.storedProcess
''/--为所有查询打开generall连接
''/--在try块中打开连接
''/--connection.Open()
''/--进行交易。
''/--Dim事务作为SqlTransaction
''/--transaction=connection.BeginTransaction(IsolationLevel.ReadCommitted)
尝试
connection.Open()
cmd.Transaction=connection.BeginTransaction()
cmd.Parameters.Add(“@FK\u-sensume\u-ID”,SqlDbType.Int)”或其他任何内容
cmd.Parameters.Add(“@FK_SubSec_SecKatSubKat_SubSubKat”,SqlDbType.Int)
对于pSentsId中的每个sentId
cmd.Parameters(“@FK_-ID”).Value=sentId
cmd.参数(“@FK_SubSec_SecKatSubKat_SubSubKat”)。值=SubSec_SecKatSubKat_SubSubKat
cmd.ExecuteNonQuery()“”/--返回受影响的行。我们不使用结果
下一个
''/--一切都好
cmd.Transaction.Commit()
捕获ex作为SqlException
结果=错误
''/--SqlException对于这种情况更具信息性
如果cmd.Transaction不是空的
cmd.Transaction.Rollback
''/--额外尝试…如果你愿意,抓住
如果结束
特例
结果=错误
''/--回滚事务。
尝试
cmd.Transaction.Rollback()
捕获ex2作为异常
“”//此catch块将处理可能发生的任何错误
''/,这将导致回滚失败,例如
''//一个封闭的连接。
''//Console.WriteLine(“回滚异常类型:{0}”,ex2.GetType())
''//Console.WriteLine(“消息:{0}”,ex2.Message)
结束尝试
最后
如果连接。状态已关闭
连接。关闭()
如果结束
结束尝试
结束使用“”//cmd
结束使用“”//连接
返回结果
B) 每个插件都是独立的。不要使用整体事务。在
循环的中添加try…catch
。在每个循环中创建SqlCommand
。这是个坏习惯。创建SqlCommand
一次,并在循环外部添加参数。在循环中设置参数值和执行查询。首先捕获SqlException
。在事务中包装一条insert语句没有多大价值。插入数据时已存在隐式事务。我认为您要问的是并发性或死锁问题。在insert语句周围使用事务不会有多大作用。作为补充说明,在像这样的传递查询中使用AddWithValue时应该小心。数据类型有时会被错误地解释。我相信,如果另一个用户插入了一个记录wi,这将运行