2017-04-12 54 views
0

我想在內存中創建一個數據庫,但是當我嘗試運行應用程序,我得到以下錯誤:我怎樣才能在內存中創建與Tableс數據庫SQLite的C#?

System.Data.SQLite.SQLiteException: 'constraint failed 

UNIQUE constraint failed: spisakhyd.Station' 

靠我錯在何處,哪些需要一些幫助來改變?

我的代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SQLite; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     private SQLiteConnection Connection; 

     public Form1() 
     { 
      InitializeComponent(); 

      label3.Hide(); 
      label4.Hide(); 

      SQLiteConnection.CreateFile("hydrodb.sqlite"); 
      SQLiteConnection Connection = new SQLiteConnection("Data Source=hydrodb.sqlite;Version=3;"); 
      Connection.Open(); 

      string createTable = ("CREATE TABLE hyddnev (Station UNSIGNED INT(5) NOT NULL PRIMARY KEY, Dat datetime NOT NULL, Stoej int(5) DEFAULT NULL, Vkol UNSIGNED FLOAT(7,3) DEFAULT NULL, CodH varchar(1) DEFAULT NULL, CodQ varchar(1) DEFAULT NULL, Temp float(3,1) DEFAULT NULL)"); 
      SQLiteCommand createHydDnev = new SQLiteCommand(createTable, Connection); 
      createHydDnev.ExecuteNonQuery(); 

      string createTable2 = ("CREATE TABLE hydmes (Station UNSIGNED INT(5) NOT NULL PRIMARY KEY, Dat datetime NOT NULL, StoejMin smallint(5) DEFAULT NULL, VkolMin UNSIGNED FLOAT(7,3) DEFAULT NULL, StoejSre smallint(5) DEFAULT NULL, VkolSre UNSIGNED FLOAT(7,3) DEFAULT NULL, StoejMax smallint(5) DEFAULT NULL, VkolMax UNSIGNED FLOAT(7,3) DEFAULT NULL)"); 
      SQLiteCommand createHydMes = new SQLiteCommand(createTable2, Connection); 
      createHydMes.ExecuteNonQuery(); 

      string createTable3 = ("CREATE TABLE spisakhyd (Station UNSIGNED INT(5) NOT NULL PRIMARY KEY, NasMesto varchar(50) DEFAULT NULL, ImeReka varchar(50) DEFAULT NULL, Lati varchar(7) DEFAULT NULL, Longi varchar(7) DEFAULT NULL, Alti float(6,2) DEFAULT NULL, Star varchar(10) DEFAULT NULL)"); 
      SQLiteCommand createSpisakHyd = new SQLiteCommand(createTable3, Connection); 
      createSpisakHyd.ExecuteNonQuery(); 

      this.Connection = Connection; 
     } 

     string pathFolder; 
     string pathFolder2; 

     string resultStation; 
     string resultStation2; 

     List<string> resultYears = new List<string>(); 
     List<string> resultYears2 = new List<string>(); 

     private void button1_Click(object sender, EventArgs e) 
     { 
      using (OpenFileDialog dialog = new OpenFileDialog()) 
      { 
       if (dialog.ShowDialog(this) == DialogResult.OK) 
       { 
        string sFileName = dialog.FileName; 
        pathFolder = sFileName; 

        label3.Text = pathFolder; 
        label3.Show();     

        string[] lines = System.IO.File.ReadAllLines(dialog.FileName); 

        int i = 0; 

        foreach (var line in lines) 
        { 

         var splittedValues = line.Split(','); 

         var firstWord = splittedValues[0]; 
         var firstYear = splittedValues[1]; 

         if (!resultYears.Contains(firstYear)) 
         { 
          resultYears.Add(firstYear); 
         } 


         if (i == 0) 
         { 
          resultStation = firstWord; 
         } 
         else 
         { 
          if (resultStation != firstWord) 
          { 
           MessageBox.Show("Файла с дневни данни трябва да съдържа само една станция!"); 
           return; 
          } 
         } 

         i++; 

         string insertStation = ("insert into spisakhyd(Station) values(" + resultStation + ")"); 

         SQLiteCommand insertSpisakHyd = new SQLiteCommand(insertStation, Connection); 
         insertSpisakHyd.ExecuteNonQuery(); 

        } 
        resultYears.Sort(); 
       } 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      using (OpenFileDialog dialog = new OpenFileDialog()) 
      { 
       if (dialog.ShowDialog(this) == DialogResult.OK) 
       { 
        string sFileName = dialog.FileName; 
        pathFolder2 = sFileName; 

        label4.Text = pathFolder2; 
        label4.Show(); 

        string[] lines = System.IO.File.ReadAllLines(dialog.FileName); 

        int i = 0; 

        foreach (var line in lines) 
        { 
         var splittedValues = line.Split(','); 

         var firstWord = splittedValues[0]; 
         var firstYear2 = splittedValues[1]; 

         if (!resultYears2.Contains(firstYear2)) 
         { 
          resultYears2.Add(firstYear2); 
         } 

         if (i == 0) 
         { 
          resultStation2 = firstWord; 
         } 
         else 
         { 
          if (resultStation2 != firstWord) 
          { 
           MessageBox.Show("Файла с месечни данни трябва съдържа само една станция!"); 
           return; 
          } 
         } 

         i++; 
        } 

        resultYears2.Sort(); 
       } 
      } 
     } 

     public void label3_Click(object sender, EventArgs e) 
     { 

     } 

     public void label4_Click(object sender, EventArgs e) 
     { 

     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      if (resultStation != resultStation2) 
      { 
       MessageBox.Show("Номера на станцията в единия файл не отговаря на номера на станцията в другият файл!" + Environment.NewLine + Environment.NewLine + 
        "ЗАБЕЛЕЖКА!" + Environment.NewLine + Environment.NewLine + "В двата файла, номера на станцията трябва да бъде един и същ!"); 
      } 

      comboBox1.Items.Add(resultStation); 

      if (string.Join(", ", resultYears) == string.Join(", ", resultYears2)) 
      //if (resultYears.Equals(resultYears2)) 
      { 
       for (int i = 0; i < this.resultYears.Count; i++) 
       { 
        comboBox2.Items.Add(resultYears[i]); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Годините от двата файла не съвпадат."); 
      } 

     } 
    } 
} 

調試採空上線102 .. 我不明白爲什麼當我創建數據庫和密切的關係,只是想在使用上線102隔壁班的調試器停止?

回答

3

documentation所示,type-name只能在最後一個單詞後面加上括號中的數字。也就是說,您必須在mediumint之前放置unsigned

(請注意,SQLite的使用dynamic typing,所以unsigned mediumint(5)相同somewhat signed notoriously big int(-5),或者乾脆int。)

+0

除此之外,你不能定義複合主鍵是在問題做的方式,否則會抱怨表「有不止一個主鍵」。 – Evk

+0

假設他想複合PK。哦,還有一個額外的逗號。 –