2017-04-12 14 views
0

私はメモリ内のデータベースを作成しようとしているが、私は、アプリケーションを実行しようとすると、私は次のエラーを取得する:どのようにSqlite C#でメモリ内にTableを使用してデータベースを作成できますか?

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を置く必要があります。

(そうunsigned mediumint(5)somewhat signed notoriously big int(-5)、または単にintと同じで、SQLiteのはdynamic typingを使用していますのでご注意ください。)それに加えて

+0

、あなたはそれが質問に行われている方法で複合主キーを定義することはできません、またはそれがしますテーブルに "複数の主キーがある"と不平を言う。 – Evk

+0

彼は複合PKを望んでいると仮定します。ああ、余分なカンマがある。 –

関連する問題