2014-09-05 2 views
0

그래서 연결하거나 시도하면이 코드가 Database.cs에서 실행됩니다. 또한 IRC 처리를 위해 SmartIRC4Net을 사용하고 있습니다. 이제 Database.cs의 Init()가 실행되지 않기 때문에 이것이 오류라는 것을 알고 있습니다! 그렇다면 테이블과 함께 "trubot.sqlite"파일을 작성하지 않습니다.SQLite가 데이터베이스 테이블을 만들지 않고 충돌합니다.

나는 왜 그것이 그것을하고 있는지 전혀 알지 못합니다. 그러나 그렇습니다.

다음은 Database.cs 코드입니다 :

public void Init(){ 
     try { 
      if (File.Exists("trubot.sqlite")) { 
       dbf = new SQLiteConnection("Data Source=trubot.sqlite;Version=3"); 
       dbf.Open(); 
       String db; 
       db = "CREATE TABLE IF NOT EXISTS '"+chan+"' (id INTEGER PRIMARY KEY, user TEXT, currency INTEGER DEFAULT 0, subscriber INTEGER DEFAULT 0, battletag TEXT DEFAULT null, uLevel INTEGER DEFAULT 0, mod INTEGER DEFAULT 0, rlvl INTEGER DEFAULT 0);"; 
       using (query = new SQLiteCommand(db, dbf)){ 
        query.ExecuteNonQuery(); 
       } 
      } else { 
       SQLiteConnection.CreateFile("trubot.sqlite"); 
       dbf = new SQLiteConnection("Data Source=trubot.sqlite;Version=3"); 
       dbf.Open(); 
       String db; 
       db = "CREATE TABLE IF NOT EXISTS '"+chan+"' (id INTEGER PRIMARY KEY, user TEXT, currency INTEGER DEFAULT 0, subscriber INTEGER DEFAULT 0, battletag TEXT DEFAULT null, uLevel INTEGER DEFAULT 0, mod INTEGER DEFAULT 0, rlvl INTEGER DEFAULT 0);"; 
       using (query = new SQLiteCommand(db, dbf)){ 
        query.ExecuteNonQuery(); 
       } 
      } 
     } catch (Exception s) { 
      Console.WriteLine("[ERROR] Error in code. " + s.Message); 
     } 
    } 
    public void addUser(String user) { 
     // add new user 
     try { 
      if (!usrExist(user)) { 
       String db = "INSERT INTO '"+chan+"' (user) VALUES ('"+user+"');"; 
       using (query = new SQLiteCommand(db,dbf)) { 
        query.ExecuteNonQuery(); 
       } 
      } 
     } catch (Exception err) { 
       Console.WriteLine("addUser is causing an error: " + err.Message); 
      } 
    } 

여기 (Program.cs에)가 충돌 다른 이유

public static void OnJoined(object sender, JoinEventArgs e) { 
    try { 
     var conf = new Config(); 
     var db = new Database(); 
     Console.WriteLine("[SELF] ["+conf.Channel+"] > *** "+e.Data.Nick+" has joined the channel!"); 
     if (!db.usrExist(e.Data.Nick)) { 
      try { 
       db.addUser(e.Data.Nick); 
      } catch (Exception er1) { 
       string lnNum = er1.StackTrace.Substring(er1.StackTrace.Length - 7, 7); 
       Console.WriteLine("Error: -- Trubot Error "+ er1.Message + " " + er1.Data.ToString() 
          + " " + er1.InnerException.Message.ToString() 
          + " " + er1.TargetSite.ToString() + " Ln: " + lnNum); 
       Console.ReadKey(); 
      } 
     } 
    } catch (Exception er1) { 
     string lnNum = er1.StackTrace.Substring(er1.StackTrace.Length - 7, 7); 
     Console.WriteLine("Error: -- Trubot Error "+ er1.Message + " " + er1.Data.ToString() 
       + " " + er1.InnerException.Message.ToString() 
       + " " + er1.TargetSite.ToString() + " Ln: " + lnNum); 
     Console.ReadKey(); 
    } 
} 

사이드 노트입니다 : 내가 MySQL을하지만 난을 사용하십시오 가능한 한 많은 운영 체제에서 실행되도록이 응용 프로그램을 가능한 빨리 포팅해야합니다. 오히려 MSSQL 또는 MySQL보다 SQLite를 사용하고 싶습니다.

+0

오류가 정확히 무엇인지 알려주지 않았습니다. 어둠 속에서 완전한 찔러 보니, 내 추측은 파일 권한이 sqlite 데이터 파일을 만들거나 데이터 파일의 수정을 차단하는 것을 차단하는 것입니다. –

+0

오류는 SmartIRC4Net :: Connect() void에서 변수가 누락되었다고 말하면서 연결을 중단하게됩니다. –

답변

0

해결했습니다. 문제는 내가 테이블 이름으로 SQL에 채널을 할당 할 때 "#"을 제거해야 할 때였습니다. 결과 코드는 다음과 같습니다.

public Database() { 
    var conf = new Config(); 
    chan = conf.Channel.Replace("#",""); 
    Init(); 
} 
+0

1. 동적으로 테이블을 생성해서는 안됩니다. 대신 채널 이름을 중앙 테이블의 열로 추가하십시오. 2. 귀하의 코드는 SQL 주입에 취약합니다. ''); DROP TABLE some_channel; - '가 입력되면? –

+0

트위치 IRC 봇입니다. 사용자 이름에 제한이 있습니다. –

관련 문제