约束失败UNIQUE约束失败

时间:2016-03-24 12:19:19

标签: c# sql sqlite

我创建了几个连接到同一个数据库的程序。此代码在某一时刻停止了异常处理:

  

约束失败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");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您收到的错误消息实际上是在告诉您错误:您的表格中已存在一条记录,其中包含moz_cookies.namemoz_cookies.hostmoz_cookies.pathmoz_cookies.origin的相同值override func prepareForDeletion() { super.prepareForDeletion() if filename != nil { let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentationDirectory, .UserDomainMask, true)[0] let pathArray = [dirPath, filename] let fileURL = NSURL.fileURLWithPathComponents(pathArray)! do { try NSFileManager.defaultManager().removeItemAtURL(fileURL) } catch let error as NSError { print("Error from prepareForDeletion - \(error)") } } else { print("filepath is empty") } ,以及阻止添加新约束的约束。

您希望如何处理这取决于您自己。

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