Namespace uDataNamespace uData.ConnectionUI FriendEnum DbConnectionTypeEnum DbConnectionType OleDb Odbc Sql Other End Enum End Namespace
ConvertType.vb
Namespace uDataNamespace uData.ConnectionUI FriendEnum ConvertTypeEnum ConvertType ADO2NET NET2ADO End Enum End Namespace
ConnectionStringConver.vb
OptionStrictOff Namespace uDataNamespace uData.ConnectionUI FriendClass ConnectionStringConverClass ConnectionStringConver PrivateSub New()SubNew() End Sub PrivateSharedFunction AdoToOleDb()Function AdoToOleDb(ByVal adoConnectionString AsString) AsString Dim mBuilder AsNew OleDb.OleDbConnectionStringBuilder(adoConnectionString) Return mBuilder.ConnectionString End Function PrivateSharedFunction AdoToOdbc()Function AdoToOdbc(ByVal adoConnectionString AsString) AsString Dim mResult AsNew Text.StringBuilder Dim AdoConnection AsObject AdoConnection =CreateObject("ADODB.Connection") AdoConnection.ConnectionString = adoConnectionString Dim mDataSource AsString=Nothing Dim mExtendedProperties AsString=Nothing Dim Key AsString=Nothing Dim Value AsString=Nothing ForEach p AsObjectIn AdoConnection.Properties Key = p.Name.ToString Value = p.Value If Key <>"Provider"Then If Key ="Data Source"Then mDataSource = Value ElseIf Key ="Extended Properties"Then mExtendedProperties = Value Else IfNot Value IsNothingThen mResult.AppendFormat("{0}={1};", Key, Value) EndIf EndIf Next If mDataSource =""Then mResult.Append(mExtendedProperties) Else mResult.AppendFormat("Dsn={0};", mDataSource) EndIf AdoConnection =Nothing Return mResult.ToString End Function PrivateSharedFunction AdoToSql()Function AdoToSql(ByVal adoConnectionString AsString) AsString adoConnectionString = System.Text.RegularExpressions.Regex.Replace(adoConnectionString, "Provider.*?;", "", Text.RegularExpressions.RegexOptions.IgnoreCase) Dim mBuilder AsNew SqlClient.SqlConnectionStringBuilder(adoConnectionString) Return mBuilder.ConnectionString End Function PrivateSharedFunction OleDbToAdo()Function OleDbToAdo(ByVal oleDbConnectionString AsString) AsString Dim mBuilder AsNew OleDb.OleDbConnectionStringBuilder(oleDbConnectionString) If mBuilder.Provider =""Then mBuilder.Provider ="SQLOLEDB.1;" Return mBuilder.ConnectionString End Function PrivateSharedFunction OdbcToAdo()Function OdbcToAdo(ByVal odbcConnectionString AsString) AsString If odbcConnectionString IsNothingThen odbcConnectionString ="" odbcConnectionString = odbcConnectionString.ToLower If odbcConnectionString.Contains("dsn=") Then Dim AdoConnection AsObject AdoConnection =CreateObject("ADODB.Connection") AdoConnection.ConnectionString = odbcConnectionString Dim mExtendedProperties AsString= AdoConnection.Properties("Extended Properties").Value If mExtendedProperties.IndexOf(";") =-1Then odbcConnectionString = odbcConnectionString.ToLower.Replace("dsn", "Data Source") EndIf AdoConnection =Nothing EndIf Dim mBuilder AsNew Odbc.OdbcConnectionStringBuilder(odbcConnectionString) Return mBuilder.ConnectionString End Function PrivateSharedFunction SqlToAdo()Function SqlToAdo(ByVal sqlConnectionString AsString) AsString Dim mBuilder AsNew SqlClient.SqlConnectionStringBuilder(sqlConnectionString) sqlConnectionString = mBuilder.ConnectionString sqlConnectionString = System.Text.RegularExpressions.Regex.Replace(sqlConnectionString, "integrated security.*?true/s{0,};{0,1}", "Integrated Security=SSPI;", Text.RegularExpressions.RegexOptions.IgnoreCase) Return"Provider = SQLOLEDB.1;"& sqlConnectionString End Function PublicSharedFunction GetString()Function GetString(ByVal dbconnectiontype As DbConnectionType, ByVal convertype As ConvertType, ByVal cnString AsString) AsString Dim mResult AsString=Nothing SelectCase dbconnectiontype Case ConnectionUI.DbConnectionType.OleDb If convertype = ConvertType.NET2ADO Then mResult = OleDbToAdo(cnString) Else mResult = AdoToOleDb(cnString) EndIf Case ConnectionUI.DbConnectionType.Odbc If convertype = ConvertType.NET2ADO Then mResult = OdbcToAdo(cnString) Else mResult = AdoToOdbc(cnString) EndIf Case ConnectionUI.DbConnectionType.Sql If convertype = ConvertType.NET2ADO Then mResult = SqlToAdo(cnString) Else mResult = AdoToSql(cnString) EndIf CaseElse' ConnectionUI.DbConnectionType.Other ThrowNew NullReferenceException("不支持当前连接方式") EndSelect Return mResult End Function End Class End Namespace
ConnectionDialog.vb
Namespace uDataNamespace uData.ConnectionUI PublicClass ConnectionDialogClass ConnectionDialog Private gDbConnection As IDbConnection =Nothing Private gConnectionString AsString=Nothing '连接方式 Private gDbConnectionType As DbConnectionType = DbConnectionType.Odbc Private gAdoConnectionString AsString=Nothing PublicProperty DbConnection()Property DbConnection() As IDbConnection Get Return gDbConnection EndGet Set(ByVal value As IDbConnection) gDbConnection = value EndSet End Property PublicProperty ConnectionString()Property ConnectionString() AsString Get Return gConnectionString EndGet Set(ByVal value AsString) gConnectionString = value EndSet End Property '判断连接方式 PrivateSub Check()Sub Check() '优先判断DbConnection.若无,判断连接字符串;若字符串为空,则取默认连接方式为Odbc If gDbConnection IsNothingThen If gConnectionString =""Then gDbConnectionType = DbConnectionType.Odbc Else '根据连接字符串的特征字来判断是哪类连接方式 If gConnectionString.ToLower.Contains("provider=") Then gDbConnectionType = DbConnectionType.OleDb ElseIf gConnectionString.ToLower.Contains("dsn=") Then gDbConnectionType = DbConnectionType.Odbc ElseIf gConnectionString.ToLower.Contains("driver=") Then gDbConnectionType = DbConnectionType.Odbc Else gDbConnectionType = DbConnectionType.Sql EndIf EndIf Else IfTypeOf gDbConnection Is OleDb.OleDbConnection Then gDbConnectionType = DbConnectionType.OleDb ElseIfTypeOf gDbConnection Is Odbc.OdbcConnection Then gDbConnectionType = DbConnectionType.Odbc ElseIfTypeOf gDbConnection Is SqlClient.SqlConnection Then gDbConnectionType = DbConnectionType.Sql Else gDbConnectionType = DbConnectionType.Other EndIf '也取连接字符串 gConnectionString = gDbConnection.ConnectionString EndIf '初始化AdoConnectionString gAdoConnectionString =Nothing End Sub PublicFunction ShowDialog()Function ShowDialog() As System.Windows.Forms.DialogResult Return ShowDialog(Nothing) End Function PublicFunction ShowDialog()Function ShowDialog(ByVal owner As System.Windows.Forms.Form) As System.Windows.Forms.DialogResult Dim mResult As System.Windows.Forms.DialogResult = System.Windows.Forms.DialogResult.OK Check() Dim mDialog AsNew AdoConnectionDialog With mDialog .ConnectionString = ConnectionStringConver.GetString(gDbConnectionType, ConvertType.NET2ADO, gConnectionString) mResult = .ShowDialog(owner) EndWith If mResult = Windows.Forms.DialogResult.OK Then gConnectionString = ConnectionStringConver.GetString(gDbConnectionType, ConvertType.ADO2NET, mDialog.ConnectionString) IfNot gDbConnection IsNothingThen '正处在连接状态下不可置值,这里强制关闭了不好,由用户处理好了 ' If gDbConnection.State = ConnectionState.Open Then gDbConnection.Close() gDbConnection.ConnectionString = gConnectionString EndIf EndIf mDialog =Nothing Return mResult End Function End Class End Namespace
以下为测试项目用到的一个文件:
ConnectionDialogTest.vb
PublicClass ConnectionDialogTestClass ConnectionDialogTest Private OleDbCn AsNew OleDb.OleDbConnection Private OdbcCn AsNew Odbc.OdbcConnection Private SqlCn AsNew SqlClient.SqlConnection Private gConnectionString AsString PublicProperty ConnectionString()Property ConnectionString() AsString Get Return gConnectionString EndGet Set(ByVal value AsString) gConnectionString = value EndSet End Property Private gNowCn As Common.DbConnection PublicReadOnlyProperty DbConnection()Property DbConnection() As Common.DbConnection Get Return gNowCn EndGet End Property Private gDialog AsNew LzmTW.uData.ConnectionUI.ConnectionDialog PublicFunction ShowDialog()Function ShowDialog(ByVal owner As Form, ByVal byConnectionString AsBoolean, ByVal DbTypeOrConnectionstring AsString) As DialogResult Dim mResult As DialogResult = DialogResult.OK If byConnectionString Then gDialog.ConnectionString = DbTypeOrConnectionstring gDialog.DbConnection =Nothing mResult = gDialog.ShowDialog(owner) If mResult = DialogResult.OK Then gConnectionString = gDialog.ConnectionString If gConnectionString.ToLower.Contains("provider=") Then gNowCn =New OleDb.OleDbConnection ElseIf gConnectionString.ToLower.Contains("dsn=") Then gNowCn =New Odbc.OdbcConnection ElseIf gConnectionString.ToLower.Contains("driver=") Then gNowCn =New Odbc.OdbcConnection Else gNowCn =New SqlClient.SqlConnection EndIf gNowCn.ConnectionString = gConnectionString EndIf Else Dim TmpCn As Common.DbConnection If DbTypeOrConnectionstring ="OleDbConnection"Then TmpCn = OleDbCn ElseIf DbTypeOrConnectionstring ="OdbcConnection"Then TmpCn = OdbcCn Else TmpCn = SqlCn EndIf gDialog.DbConnection = TmpCn mResult = gDialog.ShowDialog(owner) If mResult = DialogResult.OK Then gNowCn = TmpCn gConnectionString = gNowCn.ConnectionString EndIf EndIf Return mResult End Function End Class
测试界面代码:
PublicClass Form1Class Form1 Private Demo AsNew ConnectionDialogTest PrivateSub SetMessage()Sub SetMessage(ByVal text AsString) Me.Label1.Text =String.Format("Msg:{0}", text) End Sub PrivateSub OpenTest_Click()Sub OpenTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenTest.Click Demo.DbConnection.Open() SetMessage("已打开") End Sub PrivateSub CloseTest_Click()Sub CloseTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseTest.Click Demo.DbConnection.Close() SetMessage("已关闭") End Sub PrivateSub DbConnectionEdit_Click()Sub DbConnectionEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DbConnectionEdit.Click If Demo.ShowDialog(Me, False, Me.GetDbName) = Windows.Forms.DialogResult.OK Then Me.RichTextBox1.AppendText(System.Environment.NewLine & Demo.ConnectionString) EndIf End Sub PrivateSub ConnectionStringEdit_Click()Sub ConnectionStringEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectionStringEdit.Click If Demo.ShowDialog(Me, True, Me.RichTextBox1.SelectedText) = Windows.Forms.DialogResult.OK Then Me.RichTextBox1.AppendText(System.Environment.NewLine & Demo.ConnectionString) EndIf End Sub PrivateFunction GetDbName()Function GetDbName() AsString Dim tmpRadio As RadioButton IfMe.RadioButton1.Checked Then tmpRadio =Me.RadioButton1 ElseIfMe.RadioButton2.Checked Then tmpRadio =Me.RadioButton2 Else tmpRadio =Me.RadioButton3 EndIf Return tmpRadio.Text End Function End Class