-1
同じデータベースに接続された複数のプログラムを作成しました。そして、もう一つの点で、このコードは例外を除いて動作を停止:onstraint failed UNIQUE制約に失敗しました
制約はUNIQUE制約を失敗失敗:moz_cookies.name、 moz_cookies.host、moz_cookies.pathを、属性をmoz_cookies.origin。
次に何をすればよいですか?すでに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");
}
}
}
}
明らかに、独自の制約に違反している理由を調べる必要があります。スキーマを投稿していないので、これらのフィールドにUNIQUEがあると仮定できます。これらのフィールドに同じデータを挿入すると、論理的に失敗します。 –
あなたが次に行うべきことは、[SQLインジェクション](http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work)で読まれます。 )、パラメータ化されたクエリを使用します。その後、すでにdbに入っているクッキーレコードをどのように処理するかを調べます。 – Rik