PDA

View Full Version : جلوگیری از ثبت کلمات تکراری در ستون جدول sqlite



windowsyar
چهارشنبه 11 مرداد 1396, 15:08 عصر
سلام
این نرم افزار من هست که کلمات را از فایل متنی جدا می کند
فقط مشکلم این هست که کلمات تکراری هم در دیتابیس ذخیره می شوند
چکار کنم کلمات تکراری ثبت نشوند
دانلود (http://s8.picofile.com/file/8302374950/word_c.rar.html)(نشد اینجا آپلود کنم)

Mahmoud.Afrad
چهارشنبه 11 مرداد 1396, 15:52 عصر
ستون کلمات را از نوع unique انتخاب کنید. در صورت تکراری بودن یک استثناء رخ خواهد داد که میتونید در برنامه اونو دریافت و تصمیم گیری کنید.

windowsyar
چهارشنبه 11 مرداد 1396, 17:29 عصر
چطوری مدیریت کنم کل کد هام توی یک try هست و وقتی ارور تکراری بده کلا خارج میشه

try
{


for (int n = 0; n < aaa.Count; n++)
{
Microsoft.VisualBasic.Interaction.Command().Comman dText = "INSERT INTO tbl_word2 (matn1) SELECT '" + aaa(n) + "'";
Microsoft.VisualBasic.Interaction.Command().Execut eNonQuery();


sqlTran.Commit();
MessageBox.Show("کلمات کتاب با موفقیت جدا شدند", "تبریک", MessageBoxButtons.OK, MessageBoxIcon.Information);
}


}
catch (Exception ex)
{
sqlTran.Rollback();
}

Mahmoud.Afrad
چهارشنبه 11 مرداد 1396, 19:58 عصر
ستون matn1 را unique کنید.
Exception تمام انواع استثناء را دریافت میکند. شما از SQLiteException میتونید برای دریافت جزئیات استفاده کنید.(استثناء مربوط به دیتابیس از این نوع هست)
من چک کردم کد تکراری بودن 19 هست که میتونید با if بررسی کنید اگر تکراری بود بقیه حلقه اجرا بشه. اگر خطای دیگری بود میتونید پرتاب کنید(برای این کار یک try ... catch داخل حلقه نیاز دارید).
سعی کنید جزئیات خطاها رو جایی لاگ کنید.
از پارامترها هم استفاده کنید تا از sqlinjection جلوگیری کنید.
using (OpenFileDialog loadText = new OpenFileDialog())
{
loadText.Filter = "Text Document|*.txt|Rich Text Format Document|*.rtf|All Files|*.*";
loadText.InitialDirectory = "C:\\Users\\" + My.Computer.Name + "\\Desktop";
loadText.RestoreDirectory = true;
loadText.Title = "Load Text File";
loadText.CheckPathExists = true;
loadText.CheckFileExists = true;
if (loadText.ShowDialog() != DialogResult.OK)
return;
System.Text.UnicodeEncoding d = new System.Text.UnicodeEncoding();
byte[] b = System.IO.File.ReadAllBytes(loadText.FileName);
b = System.Text.Encoding.Convert(System.Text.Encoding. Default, System.Text.Encoding.Unicode, b);
//حذف خطوط
string mmm = TrimE(d.GetString(b)).Replace(Environment.NewLine, " ");
aaa = mmm.Split(' ');

SQLiteConnection connection1 = null;
SQLiteTransaction sqlTran = null;
SQLiteCommand command = null;
try
{
connection1 = new SQLiteConnection("Data Source=test.sqlite;version=3;");
connection1.Open();
SQLiteParameter wordParameter = new SQLiteParameter("@w");
sqlTran = connection1.BeginTransaction();
command = connection1.CreateCommand();
command.Transaction = sqlTran;
command.CommandText = "INSERT INTO tbl_word(matn1) values(@w)";
command.Parameters.Add(wordParameter);

for (int n = 0; n < aaa.Length; n++)
{
if (aaa[n] == "")
{
continue;
}

wordParameter.Value = aaa[n];
try
{
command.ExecuteNonQuery();
}
catch (SQLiteException sqliteEx)
{
if (sqliteEx.ErrorCode == 19)
{
// duplicate
continue;
}
throw sqliteEx;
}
}
sqlTran.Commit();
MessageBox.Show("کلمات کتاب با موفقیت جدا شدند", "تبریک", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SQLiteException sqLiteEx)
{
if (sqlTran != null) sqlTran.Rollback();
}
catch (Exception ex)
{
if (sqlTran != null) sqlTran.Rollback();
}
finally
{
if (connection1 != null) connection1.Close();
if (command != null) command.Dispose();
if (sqlTran != null) sqlTran.Dispose();
}
}

windowsyar
چهارشنبه 11 مرداد 1396, 20:59 عصر
واقعا متشکر از این جواب کامل و جامعتون
همه کار هایی که گفتید رو انجام دادم
پس این پیغام که میاد مال چیه ؟
کدها دقیقا همون های شما هست
این هم پروژه http://s8.picofile.com/file/8302409618/word_c.rar.html

ژیار رحیمی
چهارشنبه 11 مرداد 1396, 23:00 عصر
سلام یک روش که جناب افراد به شما گفتن و یک روش دیگر استفاده از لیست به جای آرایه هست که بعد از درج کلمات در لیست، سپس با فراخوانی متد Distinct از لیست، کلمات تکراری را فیلتر کن سپس اقدام به درج آیتم های لیست در دیتابیس کن

windowsyar
جمعه 13 مرداد 1396, 15:49 عصر
من الان فایل رو می ریزم تو آرایه میشه مستقیم ریخت تو لیست ؟
یا باید آرایه رو بریزم تو لیست
می شه کدشو بدید

ژیار رحیمی
جمعه 13 مرداد 1396, 17:42 عصر
سلام نوع متغییر aaa را در فرم بصورت زیر اصلاح کن

private IEnumerable<string> aaa;

سپس دو سه خط کد داخل رویداد کلیک رو بصورت زیر تعییر دهید

var mmm = TrimE(d.GetString(b)).Replace(Environment.NewLine, " ");
aaa = mmm.Split(' ').ToList().Distinct();

بخش try/catch رو هم به اینصورت

try
{
foreach (var item in aaa)
{
command.CommandText = "INSERT INTO tbl_word (matn1) SELECT '" + item + "'";
command.ExecuteNonQuery();
}
sqlTran.Commit();
MessageBox.Show("کلمات کتاب با موفقیت جدا شدند", "تبریک", MessageBoxButtons.OK, MessageBoxIcon.Information);

}
catch (Exception ex)
{
sqlTran.Rollback();
}