第1部分:应用场景
华仔在接口开发的过程中,
遇到一个难点,就是客户另一个供应商将数据传输过来,
但是这个需要我在数据库一种插入完成后,
还需要再另一个数据库插入数据,
但是如果只是简单的增加,
这样操作如果在向第二个数据库插入数据的时候发生报错,
这样就将导致数据的不完整,再次插入需要手动删除第一个数据库插入的数据,
非常不便,于是突发奇想,
看看能不能在两个数据库之间启用事务?
第2部分:解决方案
经过华仔的测试,其实还真可以实现,下面且听我道来
首先,我们构造一个执行sql语句的通用方法:
rem Cn为链接,strCmdText 为sql语句 ,tran 为事务 Public Function ExecuteNonQuery(ByVal Cn As SqlConnection, ByVal strCmdText As String, ByVal tran As SqlClient.SqlTransaction) As Integer Try If strCmdText = "" Then Return Nothing Dim objSqlCommand As New SqlCommand(strCmdText) objSqlCommand.Connection = Cn objSqlCommand.Transaction = tran Dim value = objSqlCommand.ExecuteNonQuery() Try If Not objSqlCommand Is Nothing Then objSqlCommand.Dispose() Catch ex As Exception End Try Return value Catch ex As Exception Throw ex End Try End Function
这里我就随意点,不过不希望大家如此哈,后续我会将我的sql通用过程分享给大家!
然后,就是调用尝试了,代码如下:
注意:这里要操作的两个数据库,分别是 dg01 和 dg02 ,
这两个数据库,我只做了一个表(测试事务)和一个字段(sky),并且将skey字段设置了主键,
下面这段代码,将可以完成在两个数据库正确插入数据
Imports System.Data.SqlClient Imports System.Configuration Public Class Form1 rem 将在两个数据库的 测试事务 数据表插入相同的内容“你好1” Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim tran As SqlTransaction = Nothing Try Dim sql As String sql = "insert into 测试事务(skey) values ('你好1')" ConnStr = "server=192.168.15.1;Uid=sa;Pwd=;dataBase=dg01;Timeout=1800;" Dim mySqlConnection As SqlConnection mySqlConnection = New SqlConnection(ConnStr) mySqlConnection.Open() tran = mySqlConnection.BeginTransaction ExecuteNonQuery(mySqlConnection, sql, tran) sql = "insert into dg02.dbo.测试事务(skey) values ('你好1')" ExecuteNonQuery(mySqlConnection, sql, tran) tran.Commit() '提交事务 mySqlConnection.Close() Catch ex As Exception If Not tran Is Nothing Then tran.Rollback() MsgBox(ex.Message.ToString + ex.StackTrace) End Try End Sub End Class
而下面这段代码,将在向dg02插入的时候报错,然后事务回滚,两个数据库都没有数据
Imports System.Data.SqlClient Imports System.Configuration Public Class Form1 rem 将在两个数据库的 测试事务 数据表插入相同的内容“你好1” Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim tran As SqlTransaction = Nothing Try Dim sql As String sql = "insert into 测试事务(skey) values ('你好2')" ConnStr = "server=192.168.15.1;Uid=sa;Pwd=;dataBase=dg01;Timeout=1800;" Dim mySqlConnection As SqlConnection mySqlConnection = New SqlConnection(ConnStr) mySqlConnection.Open() tran = mySqlConnection.BeginTransaction ExecuteNonQuery(mySqlConnection, sql, tran) sql = "insert into dg02.dbo.测试事务(skey) values ('你好2')" sql += "insert into dg02.dbo.测试事务(skey) values ('你好2')" ExecuteNonQuery(mySqlConnection, sql, tran) tran.Commit() '提交事务 mySqlConnection.Close() Catch ex As Exception If Not tran Is Nothing Then tran.Rollback() MsgBox(ex.Message.ToString + ex.StackTrace) End Try End Sub End Class
第3部分:结论
自此,我们可以清楚的知道,同时操作同一服务器的不同数据库是可以实现的
而且,不仅可以实现同时增删改查,还可以用事务进行操作
这对于我们需要操作不同的数据库来说就非常方便了
© 版权声明
THE END
暂无评论内容