数据库连接字符串这个东西复杂倒不是很复杂,我们用的时候用到的属性也没几个,就什么“Provider”、“Initial Catalog”、“data source” (Provider不同,当然设置也有所不同)等等,再加用户名、密码。可就是比较的烦一点。如果在运行时能够调出我们在设计时用的那个设置连接字符串对话框就事半功倍了。在Delphi里这非常的简单,在Delphi的ADODB单元里已经封装了相应的方法,只要uses adodb ,然后
edit1.Text := adodb.PromptDataSource(handle,edit1.Text);
连接字符串就在那个edit1里了。
在Delphi里如此简单的东东,到了.NET里是如何做的呢?在MSDN里翻了半天愣是没发现。不过想想它们设置连接字符串时调出来的窗口跟以前是一样的,用的应该是相同的东西(翻旧的MSDN可能有)。后来还是在CodeProject(http://www.codeproject.com/cs/database/DataLinks.asp )里找到了方法,果然不出所料是旧东西翻新的。代码量比Delphi里多一点点,不过也是很简单。
先加引用,一个是adodb.dll(在$Program Files$"Microsoft.NET"Primary Interop Assemblies",这个在添加引用里就有),一个是oledb32.dll(在$Program Files$"Common Files"System"Ole DB",这个要点“浏览”按钮去选)。
基本代码如下:
MSDASC.DataLinks datalinks = new MSDASC.DataLinksClass();
ADODB._Connection tmpconc = new ADODB.ConnectionClass();
if (TextDbstr.Text == String.Empty) {
tmpconc = (ADODB._Connection)datalinks.PromptNew();
TextDbstr.Text = tmpconc.ConnectionString;
}else{
Object oconc = tmpconc;
tmpconc.ConnectionString = TextDbstr.Text;
if (datalinks.PromptEdit(ref oconc))
TextDbstr.Text = tmpconc.ConnectionString;
}
如果你用的是OleDbConnection,就可以用上面得到的字符串当作ConnectionString了,但如果你用的是SqlConnection如果直接用的话,连接时会抛出System.ArgumentException: 说不支持关键字: “provider”。显然对SqlConnection来说provider是定的,所以对连接字符串来说这一项设置多余了(我们在VS.NET中设计时也能看到它的连接串是没有provider的)。那么我们在上面产生的连接字符串就不能直接用了。作简单的处理就可以了(就是去除provider部分)。
下面是测试代码:
OleDbConnection:
OleDbConnection connection = new OleDbConnection();
try{
connection.ConnectionString = TextDbstr.Text;
connection.Open();
MessageBox.Show("Connection OK");//在OleDbConnection下正常连接
}catch (Exception ex){
MessageBox.Show(ex.ToString());
}finally{
connection.Close();
}
SqlConnection没有作任何处理时:
SqlConnection connection = new SqlConnection();
try{
connection.ConnectionString = TextDbstr.Text;
connection.Open();
MessageBox.Show("Connection OK");
}catch (Exception ex){
MessageBox.Show(ex.ToString());//在Sqlconnection时,直接用的话会抛出System.ArgumentException
}finally{
connection.Close();
}
作了相应处理后正常了:
SqlConnection connection = new SqlConnection();
try{
int pos = TextDbstr.Text.IndexOf(";");//偷了个懒,系统产生的连接字符串,在第一个分号前的就是provider部分
string constr = TextDbstr.Text.Remove(0,pos);
connection.ConnectionString = constr;
connection.Open();
MessageBox.Show("Connection OK");//这下正常了
}catch (Exception ex) {
MessageBox.Show(ex.ToString());
}finally{
connection.Close();
}