2016-03-24 8 views
-1

同じデータベースに接続された複数のプログラムを作成しました。そして、もう一つの点で、このコードは例外を除いて動作を停止:onstraint failed UNIQUE制約に失敗しました

制約はUNIQUE制約を失敗失敗:moz_cookies.name、 moz_cookies.host、moz_cookies.pathを、属性をmoz_cookies.origin。

次に何をすればよいですか?すでにmoz_cookies.namemoz_cookies.hostmoz_cookies.pathmoz_cookies.originの値が同じである、あなたのテーブルのレコードが存在し、新しいものを追加しないように制約があります:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SQLite; 
using System.Linq; 


namespace ReflCookie 
{ 
    class CookieSQLite 
    { 
     protected SQLiteConnection SqLiteConnection; 
     protected MyDBContext MyDbContext = new MyDBContext(); 

     public CookieSQLite() 
     { 
     } 

     public CookieSQLite(string database) 
     { 
      SqLiteConnection = new SQLiteConnection(@"DataSource= "+database); 
      try 
      { 
       SqLiteConnection.Open(); 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 

     public List<CookieRow> GetCookie() 
     { 
      SQLiteCommand sqLiteCommand = new SQLiteCommand(); 
      sqLiteCommand.CommandText = "Select * from `moz_cookies` order by `id` asc"; 
      sqLiteCommand.Connection = SqLiteConnection; 
      SQLiteDataReader sqLiteDataReader = sqLiteCommand.ExecuteReader(); 
       DataTable dataTable = new DataTable(); 
       List<CookieRow> cookies = new List<CookieRow>(); 
       dataTable.Load(sqLiteDataReader); 
       foreach (DataRow row in dataTable.Rows) 
       { 
        CookieRow cookie = new CookieRow(); 
        cookie.Id = Convert.ToInt32(row.ItemArray[0].ToString()); 
        cookie.BaseDomain = row.ItemArray[1].ToString(); 
        cookie.OriginAttributes = row.ItemArray[2].ToString(); 
        cookie.Name = row.ItemArray[3].ToString(); 
        cookie.Value = row.ItemArray[4].ToString(); 
        cookie.Host = row.ItemArray[5].ToString(); 
        cookie.Path = row.ItemArray[6].ToString(); 
        cookie.Expiry = row.ItemArray[7].ToString(); 
        cookie.LastAccessed = row.ItemArray[8].ToString(); 
        cookie.CreationTime = row.ItemArray[9].ToString(); 
        cookie.IsSecure = Convert.ToInt32(row.ItemArray[10].ToString()); 
        cookie.IsHttpOnly = Convert.ToInt32(row.ItemArray[11].ToString()); 
        cookie.AppID = Convert.ToInt32(row.ItemArray[12].ToString()); 
        cookie.InBrowserElement = Convert.ToInt32(row.ItemArray[13].ToString()); 

        cookies.Add(cookie); 
       } 
       return cookies; 
      } 

     public void DeleteCookieRows() 
     { 
      SQLiteCommand sqLiteCommand = new SQLiteCommand(); 
      sqLiteCommand.CommandText= "DELETE FROM moz_cookies where Name = 'NID'"; 
      sqLiteCommand.Connection = SqLiteConnection; 
      sqLiteCommand.Parameters.AddWithValue("Name", "NID"); 
      sqLiteCommand.ExecuteNonQuery(); 

     } 

     public void IdCookieIsEmpty(List<CookieRow> c, List<CookieRow> cookiesRows, string profileCookies) 
     { 
      if (cookiesRows != null && cookiesRows.Count != 0) 
      { 
       UpdateCookie(c, profileCookies); 
      } 
      else 
      { 
       List<CookieRow> cookieRows = GetCookie(); 
       List<CookieRow> idCookies = cookieRows.Where(row => row.Name == "_gads").ToList(); 
       if (idCookies != null && idCookies.Count != 0) 
       {     
        foreach (CookieRow cookie in idCookies) 
        { 
         MyDbContext.Cookie.Add(cookie); 
        } 
        MyDbContext.SaveChanges(); 
        Console.WriteLine("Cookies saved to 'AMAZONE_db' file"); 
        Console.WriteLine("Press any key to close application"); 
       } 
       List<CookieRow> qLiteCookie = MyDbContext.Cookie.ToList(); 
       UpdateCookie(qLiteCookie, profileCookies); 

      } 

     } 

     private void UpdateCookie(List<CookieRow> c, string profileCookies) 
     { 
      foreach (CookieRow cookie in c) 
      { 
       SQLiteCommand sqLiteCommand = new SQLiteCommand(); 
       SQLiteConnection qLiteConnection = new SQLiteConnection(@"DataSource= " + profileCookies); 
       qLiteConnection.Open(); 
       sqLiteCommand.CommandText = 
        "UPDATE moz_cookies SET Id='"+cookie.Id+"',BaseDomain = '" + cookie.BaseDomain + "', " + 
        "originAttributes='" + cookie.OriginAttributes + "'," + 
        "name='" + cookie.Name + "', value='" + cookie.Value + "', " + 
        "host='" + cookie.Host + "',path='" + cookie.Path + "', " + 
        "expiry='" + cookie.Expiry + "', lastAccessed='" + cookie.LastAccessed + "', " + 
        "creationTime='" + cookie.CreationTime + "', isSecure='" + cookie.IsSecure + "', " + 
        "isHttpOnly='" + cookie.IsHttpOnly + "', appId='" + cookie.AppID + "', " + 
        "inBrowserElement='" + cookie.InBrowserElement + "'"; 

       sqLiteCommand.Connection = SqLiteConnection; 
       sqLiteCommand.ExecuteNonQuery(); 

       qLiteConnection.Close(); 

       Console.WriteLine("D"); 
      } 
     } 
    } 
} 
+0

明らかに、独自の制約に違反している理由を調べる必要があります。スキーマを投稿していないので、これらのフィールドにUNIQUEがあると仮定できます。これらのフィールドに同じデータを挿入すると、論理的に失敗します。 –

+0

あなたが次に行うべきことは、[SQLインジェクション](http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work)で読まれます。 )、パラメータ化されたクエリを使用します。その後、すでにdbに入っているクッキーレコードをどのように処理するかを調べます。 – Rik

答えて

0

あなたが得るエラーメッセージが文字通り間違って何を言っています。

どのように処理したいのかはあなた次第です。

また、SQL Injectionであなたのコードがひどく脆弱であることをお読みください。

関連する問題