2009-04-30 2 views
5

class DBConnection 안에 다음과 같은 방법이 있습니다. 내가 쿼리를 실행할 수 있도록 연결을 열 때 SQLiteConnection conn = DBConnection.OpenDB();과 같은 메서드를 호출합니다. 연결을 닫을 때 비슷한 메서드를 호출 할 수 있습니다.데이터베이스가 없으면 SQLite 연결이 실패합니까? (삭제/이동)

방법 :

public static SQLiteConnection OpenDB() 
{ 
    try 
    { 
     //Gets connectionstring from app.config 
     string myConnectString = 
      ConfigurationManager.ConnectionStrings[ 
       "LegMedSQLLite.Properties.Settings.LegMedSQLLiteDBConnectionString"].ConnectionString; 

     var conn = new SQLiteConnection(myConnectString); 

     conn.Open(); 
     return conn; 
    } 
    catch (SQLiteException e) 
    { 
     MessageBox.Show(e.ToString(), "TEST"); 
     return null; 
    } 
} 

이 모든 벌금과 멋쟁이 작동합니다. 문제는 try-catch입니다. 다음 시나리오를 가정 해 보겠습니다.

  • 데이터베이스 파일은 이동/삭제되었습니다.

예외가 발생하지 않습니다. 실제로, 내가 처음 비틀 거리는 첫 번째 캐치는 내 첫 쿼리를 실행할 때입니다.이 테이블에서는 테이블이없고 자체 예외가 throw됩니다. 나는이 이상한 현상에 놀랐다. 그러나 곧 SQLite가 새로운 빈을 생성한다는 것을 알게되었다. 데이터베이스. 비어 있음이란 테이블이 없음, 아무 것도 없으며, 거기에 있어야만했던 이전 데이터베이스와 동일한 이름을 가진 SQLite 데이터베이스 파일입니다.

이 문제는 응용 프로그램이 SQLiteConnection conn = DBConnection.OpenDB();으로 전화하자 마자 잘못된 것이 있는지 (데이터베이스를 찾을 수 없음, 손상됨, 다른 프로세스에서 사용 중인지 등) 알기를 원합니다.

당연히 필자는 필자의 방법으로 File.Exists를 호출 할 수는 있지만 적절한 해결책이 아닌 것 같습니다. 어떤 도움이 필요합니까?

답변

17

적어도 System.Data.SQLite에서 연결 문자열에 "FailIfMissing=True"을 추가 할 수 있습니다. SQLiteConnection.Open()은 데이터베이스 파일이없는 경우 SQLiteException을 던집니다.

string ConnectString = "Data Source=file.sdb; FailIfMissing=True"; 
DbConnection db = new SQLiteConnection(ConnectString); 
db.Open(); // Fails if file.sdb does not exist 

는 "사용 안함 데이터베이스 동작을 생성"을 찾아, 또 다른 예를 들어 SQLite Connection String Samples를 참조하십시오.당신이 데이터베이스 손상 문제를 발견에서 시작하려면

2

SQLite는 사용하지 않았지만 새로운 데이터베이스를 자동으로 생성하는 것은 아주 기괴한 동작입니다.

연결을 연 직후에 Select top 1 * From Table을 수행하도록 try 블록을 조정할 수 있습니다. 작동하는 경우 결과를 버리고 conn 개체를 계속 반환 할 수 있습니다. 실패하면 예외 처리기가 실행됩니다.

+1

그래로 변환 할 수 있습니다 생각에서 연결 문자열이 있다고 가정합니다! 그러나이 작업은 전적으로 System.Data.SQLite가 아닌 것 같습니다. 나는 SQLite 웹 서버가 사용하는 것을 알고있다. 또한 SQL 쿼리 아이디어도 생각해 봤지만 낭비처럼 보입니다. 이 작업을 수행하는 데 "적절한"방법이 없다면 대답을 승인 된 대답으로 표시 할 것입니다. – CasperT

-2

기본 SQLite 동작을 변경할 수있는 방법이 없으면 File.Exists를 수행해야 할 수 있습니다. 새로운 파일을 연결하고 생성하고 원하는 데이터베이스인지 확인한 다음 catch 블록에서 새 파일을 삭제하는 것보다 낫습니다.

-1

해당 수준에서 잡지 마십시오. 대신 SQLiteConnection은 IDisposable을 구현해야합니다. 즉, 열린 연결을 반환하고 예외를 처리 할 수있는 호출 코드를 허용하고 Dispose 메서드를 사용하여 연결을 닫아야합니다.

1

, 명령을

프라 그마 integrity_check을 실행할 수 있습니다;

또는

프라그 quick_check; (빠르지 만 철저하지는 않음)

"ok"값을 가진 단일 행을 반환합니다.

그렇지 않으면 발생하는 오류를보고합니다. SQLite는 사용을 위해

0

이 : 당신이 텍스트 상자 txtConnSqlite

 Using conn As New System.Data.SQLite.SQLiteConnection(txtConnSqlite.Text) 
      Dim FirstIndex As Int32 = txtConnSqlite.Text.IndexOf("Data Source=") 
      If FirstIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub 
      Dim SecondIndex As Int32 = txtConnSqlite.Text.IndexOf("Version=") 
      If SecondIndex = -1 Then MsgBox("ConnectionString is incorrect", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub 
      Dim FilePath As String = txtConnSqlite.Text.Substring(FirstIndex + 12, SecondIndex - FirstIndex - 13) 
      If Not IO.File.Exists(FilePath) Then MsgBox("Database file not found", MsgBoxStyle.Exclamation, "Sqlite") : Exit Sub 
      Try 
       conn.Open() 
       Dim cmd As New System.Data.SQLite.SQLiteCommand("SELECT * FROM sqlite_master WHERE type='table';", conn) 
       Dim reader As System.Data.SQLite.SQLiteDataReader 
       cmd.ExecuteReader() 
       MsgBox("Success", MsgBoxStyle.Information, "Sqlite") 
      Catch ex As Exception 
       MsgBox("Connection fail", MsgBoxStyle.Exclamation, "Sqlite") 
      End Try 
     End Using 

나는 그것뿐만 아니라라고 생각하면 easilly C# 코드

관련 문제