Sql server 多个SQL Server数据库访问

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

准备一个应用程序,该应用程序将由大约40名office用户使用本地网络上的本地SQL Server。在VB.NET中开发的应用程序。我已经阅读了一些文档,但我想直接从您那里获得一些关于数据访问的知识

这是一个Winforms应用程序,我想知道我正在使用的事务是否足以保护数据,例如,当一个用户使用某些数据,而另一个用户将同时更改数据时,事务是否会保护它?有人能简单地给我解释一下情况吗

我在应用程序中使用的SQL事务示例

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,这将运行