2014-04-04 34 views
1

这里我的连接字符串有什么问题pls。它报告cnn未申报。在if语句中使用连接字符串

 Dim cnn As New OleDbConnection 
     If rdbtnNewDbase.Checked = True Then 
      Dim cnn As new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\HCHPClosedIn11.mdb") 
     ElseIf rdbtnOldDbase.Checked = True Then 
      Dim cnn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\HCHPold.mdb") 
     End If 
+0

你会得到一个错误?为什么不创建两个连接并有条件地访问它们? – Plutonix

+1

你为什么不停地重新调光cnn。为什么不在if语句中使用'cnn = xxxxx' – logixologist

+2

这是否甚至可以编译?回答它没有。 “变量'cnn'在一个封闭块中隐藏了一个变量” - 试着看看那个错误 –

回答

5

您尝试在If/End If范围内重新声明连接对象。就这样,你的代码甚至不能编译。此外,变量不能在它们被宣布范围外使用

你真正想要做的是什么:

Dim cnn As OleDbConnection 
If rdbtnNewDbase.Checked = True Then 
    cnn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\HCHPClosedIn11.mdb") 
ElseIf rdbtnOldDbase.Checked = True Then 
    cnn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\HCHPold.mdb") 
End If 

或者,使其更短,更清晰:

Dim cs As String = 
    "Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\" & 
    If(rdbtnNewDbase.Checked, "HCHPClosedIn11.mdb", "HCHPold.mdb") 

Dim cnn As New OleDbConnection(cs) 
+0

在你的缩短的例子中,不应该是Iff而不是简单的如果? –

+3

由于VS2008内嵌'If'语句在[tag:VB.NET]中是允许的。 – Crono

+2

@Dom尽可能避免使用'iif',它只是为了向后兼容。无论条件如何,它都会真正执行True和False部分。 '如果'是.NET的方式来做到这一点,适当的短路和所有。 –

1

试试这个:

Using cnn As New OleDbConnection(string.Format(
    "Provider=Microsoft.Jet.OLEDB.4.0; Persist Security Info=false; Data Source=..\{0}", 
    If(rdbtnNewDbase.Checked, "HCHPClosedIn11.mdb", "HCHPHold.mdb")) 

    '... 
End Using 
+0

这当然假设连接立即被使用。仍然是+1。 – Crono

+0

我相信.Net中的短对象生命周期:如果你在使用它之前很久就创建了连接对象实例,那么你做错了什么。 –

+0

没错,但这并不意味着连接必须在创建的确切范围内使用。例如,工厂类的'CreateConnection'方法将返回它创建的连接。因此,调用者有责任处理它。 – Crono