PDA

View Full Version : سوال: خواندن اطلاعات اکسل و ذخیره در بانک اطلاعاتی SQLite بوسیله کد در سی شارپ



barman.ar16
پنج شنبه 12 اسفند 1395, 19:36 عصر
سلام به همه دوستان و اساتید بزرگوار
قبل از هر چیزی خدمتتون عرض کنم که کل انجمن رو زیر و رو کردم مطلب مشابهی پیدا نکردم به همین دلیل سوالم رو می پرسم شاید با کمک شما اساتید عزیز به جواب برسم
درضمن فکر کنم در آینده این تاپیک به درد خیلی ها بخوره چون تا جایی که من گشتم راجع به این موضوع هیچ مطلب مفیدی در سایت های داخلی ندیدم

بنده میخوام توی فرم سی شارپی که تهیه کردم بوسیه یک دکمه از کاربر یک فایل اکسل رو بخوام و بعد بتونم تمامی اطلاعات ردیف های اکسل رو درون بانک SQLite خودم بریزم
البته فایل اکسل باید از یک سری ستون های ثابت و مشخص پیروی کنه مثلا 8 ستون با داده هایی از یک نوع

خب این مطلب رو با جستجوهایی که کردم پیدا کردم که مثل اینکه از روش bulk insert استفاده کرده :
http://www.dotnettips.info/post/1704/%d8%ae%d9%88%d8%a7%d9%86%d8%af%d9%86-%d8%b3%d8%b1%db%8c%d8%b9-%d8%a7%d8%b7%d9%84%d8%a7%d8%b9%d8%a7%d8%aa-%d9%81%d8%a7%db%8c%d9%84-%d8%a7%da%a9%d8%b3%d9%84-%d9%88-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%af%d8%b1-%d8%a8%d8%a7%d9%86%da%a9-sql

متاسفانه این روش رو SQLite جواب نمیده ...
تا جایی که من پیگیر شدم مثل اینکه باید از Transaction استفاده بشه ... نمیدونم راهش چیه یکجایی هم دیدم اشاره به کتابخانه EPPlus کرده بود

درکل ممنون میشم راهنمایی کنید دقیقا برای اتمام پروژه ام به همین مسئله نیازمندم
متشکرم

barman.ar16
جمعه 13 اسفند 1395, 05:52 صبح
دوستان من خودم این روش رو پیدا کردم :

1- ابتدا اطلاعات رو از فایل اکسل میخونم و میریزم درون یک دیتا گرید ویو
بوسیله این کدها که درون این لینک توضیح داده : https://www.mspsoft.com/1394/07/26/%D8%AE%D9%88%D8%A7%D9%86%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-excel-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/

2- سپس تک تک اطلاعات رو از سلول های همون دیتاگرید ویو بوسیله insert درون پایگاه sqlite ذخیره می کنم
بوسیله این کد :

foreach (DataGridViewRow row in dataGridView1.Rows)
{
string constring = "Data Source=Db_Gavahi.sqlite;Version=3";
using (SQLiteConnection con = new SQLiteConnection(constring))
{
using (SQLiteCommand cmd = new SQLiteCommand("INSERT INTO Per2 VALUES(@Kod, @Per, @Sho, @Mon)", con))
{
cmd.Parameters.AddWithValue("@Kod", row.Cells[0].Value);
cmd.Parameters.AddWithValue("@Per", row.Cells[1].Value);
cmd.Parameters.AddWithValue("@Sho", row.Cells[2].Value);
cmd.Parameters.AddWithValue("@Mon", row.Cells[3].Value);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
MessageBox.Show("Records inserted.");

خب در واقع مشکلی هم وجود نداره اما نمیدونم اینکار کار بهینه و درستی هست یا نه ....؟؟؟
من یک فایل اکسل با 4 ستون و تقریبا 6500 ردیف رو بوسیله این روش میریزم درون sqlite که حدودا 20 ثانیه طول میکشه البته روی سیستم خودم اینطوریه که سیستم رده بالایی هست نمیدونم روی سیستم های دیگه چقدر طول بکشه
ممنون میشم اگر روش بهینه تری هست بهم معرفی کنید

Mahmoud.Afrad
جمعه 13 اسفند 1395, 19:53 عصر
در تراکنش انجام بدید سرعت بهبود پیدا میکنه
https://www.jokecamp.com/blog/make-your-sqlite-bulk-inserts-very-fast-in-c

barman.ar16
سه شنبه 17 اسفند 1395, 12:50 عصر
سلام به همگی
خب بعد از جستجوهای فراوان و بعد از آزمون و خطا به این کد رسیدم :

using (SQLiteConnection conn = new SQLiteConnection("Data Source=Db_Bank.sqlite;Version=3"))
{
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand(conn))
{
using (SQLiteTransaction tran = conn.BeginTransaction())
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
cmd.CommandText= "INSERT INTO MyTable VALUES(@Name, @Family, @Kod, @Mon)";
cmd.Parameters.AddWithValue("@Kod", row.Cells[0].Value);
cmd.Parameters.AddWithValue("@Per", row.Cells[1].Value);
cmd.Parameters.AddWithValue("@Sho", row.Cells[2].Value);
cmd.Parameters.AddWithValue("@Mon", row.Cells[3].Value);
cmd.ExecuteNonQuery();
}
tran.Commit();
}
}
conn.Close();
MessageBox.Show("records inserted");
}

این رو گذاشتم شاید به درد دیگران دوستان بخوره
نکته جالب اینکه با کد قبلی که tansaction استفاده نکرده بودم یک فایل اکسل رو با حدودا 30 ثانیه ریختم توی بانک با این کد هر فایلی رو با هر تعداد رکورد با زیر 1 ثانیه میریزم توی بانک جالب هست فقط زیر 1 ثانیه !!!!

ممنون از استاد عزیز و اهنمایی هاشون کاربر محترم Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad)