2014-09-05 50 views
0

因此,當我連接或試圖在Database.cs中運行此代碼時。 另外,我使用SmartIRC4Net進行IRC處理 現在我知道這是錯誤,因爲Database.cs中的Init()甚至沒有運行!如果是這樣,它不會爲表創建「trubot.sqlite」文件。SQLite不會創建數據庫表,崩潰irc bot

我不知道爲什麼它這樣做,但它是。

這裏的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,但我需要此應用程序儘可能便攜,並在儘可能多的操作系統上運行。我寧願使用SQLite而不是MSSQL或MySQL。

+0

您從來沒有告訴過我們究竟是什麼錯誤。從黑暗中的一個完整的刺,我的猜測是文件權限阻止創建sqlite數據文件或阻止數據文件的修改。 – 2014-09-05 19:23:27

+0

錯誤是它會停止連接,並說它缺少來自SmartIRC4Net :: Connect()void的變量。 – 2014-09-05 22:11:07

回答

0

我修好了。問題出在我將頻道作爲表名稱分配給SQL時,我需要從中刪除「#」。所以下面是結果代碼:

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

1.您不應該像那樣動態創建表格。改爲將頻道名稱添加爲中央表格的列。 2.您的代碼易受SQL注入攻擊。你知道如果用戶名爲'「)DROP TABLE some_channel; --'會出現什麼情況嗎? – 2014-09-05 23:10:32

+0

這是一個Twitch IRC bot,對用戶名可能有限制。 – 2014-09-20 20:57:02