我创建了几个连接到同一个数据库的程序。此代码在某一时刻停止了异常处理:
约束失败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 :(得分:0)
您收到的错误消息实际上是在告诉您错误:您的表格中已存在一条记录,其中包含moz_cookies.name
,moz_cookies.host
,moz_cookies.path
和moz_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,因为您的代码非常容易受到攻击。