2016-03-24 133 views
-1

我创建了几个连接到同一个数据库的程序。而这种代码在一个点上停止了与例外的工作:Сonstraint失败UNIQUE约束失败

约束失败UNIQUE约束失败:moz_cookies.name, moz_cookies.host,moz_cookies.path,moz_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 )并使用参数化查询。之后,找出你想如何处理已经在你的数据库中的cookie记录。 – Rik

回答

0

你得到的错误消息简直是在告诉你什么是错的:有已经存在于你的表格,表格中moz_cookies.namemoz_cookies.hostmoz_cookies.pathmoz_cookies.origin相同值的记录,并有防止添加新的约束。

你想如何处理,取决于你。

此外,我建议你阅读SQL Injection,因为你的代码非常易受攻击。