2014-04-04 2 views
1

여기 내 연결 문자열에 문제가있을 수 있습니다. 그것은 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 부분을 실제로 실행합니다. 'If'는 적절한 단락 회로와 함께 모든 것을 수행하는 .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