PDA

View Full Version : سوال: ساخت نرم افزار حدیث با دیتابیس sql



windowsyar
شنبه 13 آذر 1395, 18:13 عصر
بسم الله الرحمن الرحیم
با لطف خدا و کمک دوستان که کمک هاشون در سوال و پاسخ های زیر مشخص است
یک نرم افزار قرآن و حدیث ساخته شد.

بانک اطلاعاتی : SQLite
زبان برنامه نویسی : vb.net , سی شارپ
ویژگی ها :
افزودن ، ویرایش و حذف حدیث
جستجو در احادیث
تبدیل فایل txt به SQLite
موضوع بندی احادیث

-------------------------------------------------------------
لینک دانلود : سی شارپ (http://s9.picofile.com/file/8278632234/ghoranvaetrat_7_c.rar.html) و وی بی دات نت (http://s8.picofile.com/file/8278632392/ghoranvaetrat_7.rar.html)
آخرین آپدیت 25 آذر 1395
--------------------------------------------------------------

Mahmoud.Afrad
شنبه 13 آذر 1395, 19:28 عصر
فکر کنم کارتون با دیتابیس های پرتابل مثل sqlite و یا حتی فایل معمولی راه بیفته و نیازی به sqlserver نیست.

windowsyar
شنبه 13 آذر 1395, 19:52 عصر
فکر کنم کارتون با دیتابیس های پرتابل مثل sqlite و یا حتی فایل معمولی راه بیفته و نیازی به sqlserver نیست.

حدود 100 تا فایل تکس هستش تو هر کدوم 10000 حدیث ، هر حدیث یک رکورد هستش
بعد هم من تازه sql را دارم یاد می گیرم
اول این که آیا می شود این حجم اطلاعات را در دیتابیس های پرتابل انجام داد؟
و دوم این که آیا کار با این دیتابیس ها آسان است و سورسی برای آموزش دارد ؟
در ضمن من قبلا با آرایه ها یک برنامه ساختم و کاملا هم صحیح کار می کند ولی برای هر جستجو 10 ثانیه زمان می برد.

esafb52
شنبه 13 آذر 1395, 21:16 عصر
حدود 100 تا فایل تکس هستش تو هر کدوم 10000 حدیث ، هر حدیث یک رکورد هستش
بعد هم من تازه sql را دارم یاد می گیرم
اول این که آیا می شود این حجم اطلاعات را در دیتابیس های پرتابل انجام داد؟
و دوم این که آیا کار با این دیتابیس ها آسان است و سورسی برای آموزش دارد ؟
در ضمن من قبلا با آرایه ها یک برنامه ساختم و کاملا هم صحیح کار می کند ولی برای هر جستجو 10 ثانیه زمان می برد.

سلام احتیاجی به این کار نیست اولا دیتابیس Sql lite کاملا مناسب برای پروژه شما
و در ثانی احتیاجی به ورود تک تک و ثبت دستی نیست شما میتونی با یک حلقه ابتدا تمام فایل ها رو بخونی و بعد هم بصورت خودکار در دیتابیس ذخیره و استفاده کنی

windowsyar
شنبه 13 آذر 1395, 21:24 عصر
سلام احتیاجی به این کار نیست اولا دیتابیس Sql lite کاملا مناسب برای پروژه شما
و در ثانی احتیاجی به ورود تک تک و ثبت دستی نیست شما میتونی با یک حلقه ابتدا تمام فایل ها رو بخونی و بعد هم بصورت خودکار در دیتابیس ذخیره و استفاده کنی
بله اگر پروژه من را نگاه می کردید قسمتی برای ورودی txt دارم که هر خط وارد یک فیلد می شود و کد آن را نوشته ام
مشکل من در چیز های ساده هست مثل این که در کدی که نوشته ام شماره آی دی ها را نمی توانم درست قرار دهم
یعنی بزرگترین آی دی را نمی توانم به دست بیاورم
جستجو هم کردم نتیجه ای نداشته است
در کل دنبال یک فردی هستم که بسیار با sql کار کرده و بتواند ریزه کاری های پروژه را انجام دهد که اگر باشد خیلی دعایش می کنم

windowsyar
یک شنبه 14 آذر 1395, 14:33 عصر
سلام
کمی درباره Sql lite تحقیق کردم
دو تاسوال دارم
1.برنامه شامل Sql lite را می توان به سادگی در اختیار بقیه قرار داد
2.آیا سورس کاملی برای آموزش هست چون من اصلا یاد ندارم
با تشکر

Masoomeh.H
یک شنبه 14 آذر 1395, 15:02 عصر
سلام
کمی درباره Sql lite تحقیق کردم
دو تاسوال دارم
1.برنامه شامل Sql lite را می توان به سادگی در اختیار بقیه قرار داد
2.آیا سورس کاملی برای آموزش هست چون من اصلا یاد ندارم
با تشکر

سلام
بله به راحتی می شه در اختیار بقیه گذاشت
شما sqlite managment رو دانلود کنید. به ضورت پورتبل هست. دستوراتش هم مثل sql هست هرجایی هم مشکل داشتید از دوستان اینجا بپرسید راهنماییتون می کنند

windowsyar
یک شنبه 14 آذر 1395, 15:15 عصر
سلام
بله به راحتی می شه در اختیار بقیه گذاشت
شما sqlite managment رو دانلود کنید. به ضورت پورتبل هست. دستوراتش هم مثل sql هست هرجایی هم مشکل داشتید از دوستان اینجا بپرسید راهنماییتون می کنند
خیلی ممنون از شما
SQLite Expert Professional رو دانلود کردم
فعلا دسترسی به سیستم خودم ندارم تا باهش کار کنم
فقط می خواستم بدونم اگر بخواهم این برنامه را به کس دیگری بدهم باید SQLite Expert Professional را نصب کند
در این برنامه هم باید اتچ و ... را انجام داد
یا همین که دیتابیس کنار برنامه باشد مشکل حل می شود

hamid_hr
یک شنبه 14 آذر 1395, 16:55 عصر
برا استفاده از sqlite یک dll هست باید به رفرنسای برنامه اضافه کنید
فقط همین.
این dl همه کارهای مربوط به موتور دیتابیس رو انجام میده

windowsyar
یک شنبه 14 آذر 1395, 22:38 عصر
واقعا از ممنون از راهنمایی هاتون
من با برنامه کار کردم
تونستم یک فایل .db بسازم که اینجا گذاشتم
در این جا دو تا table ساختم
در یک table می خواهم نام کتاب ها ذخیره شود
و در table دیگر احادیث ذخیره شوند
لطفا دیتابیسم را ببینید درست ساخته ام یا نه ؟
و لطفا بگویید با چه کد هایی از آن در برنامه استفاده کنم
یعنی چگونه وصل شوم حدیث و کتاب اضافه و حذف و آپدیت و جستجو کنم
اگر لطف کنید یک سورس بذارید که به این دیتا من وصل شود واقعا ممنون می شوم
سورس در اینترنت هست ولی هر چه که من دانلود کردم یا اشکال داشت یا ناقص بود

windowsyar
جمعه 19 آذر 1395, 23:11 عصر
لطفا اگر امکان دارد جواب سوالی که اول تاپیک نوشتم را بفرمایید.
توی قسمت افزودن حدیث برای این که یک حدیث وارد بشه مشکل ندارم و وارد میشه
ولی وقتی می خواد از فایل txt هزار تا حدیث وارد برنامه کنه چون باید 1000 دفعه دستور insert رو با حلقه بدم
برنامه حدود 10 دقیقه طول میکشه این کار رو بکنه
به نظرتون چکار کنم
این هم لینک فایل txt با 1000 تا پراگراف که هر کدم یک حدیث است. لینک (http://s9.picofile.com/file/8277894850/os1.rar.html)[/B]

hamid_hr
شنبه 20 آذر 1395, 16:41 عصر
خب شما میتونی اینطوری اطلاعات رو وارد کنی


insert into tbl1(id,name)
values(1,'hamid'),(2,'ali)

windowsyar
شنبه 20 آذر 1395, 22:35 عصر
خب شما میتونی اینطوری اطلاعات رو وارد کنی


insert into tbl1(id,name)
values(1,'hamid'),(2,'ali)



خیلی ممنون از توجهتون
ولی این کد خطای
SQLite error
near ",": syntax error
lمی دهد فکر کنم برای SQLite نمی شه استفاده کرد اگر میشد خیلی خوب بود
این کد من است

SQLiteConnection con = new SQLiteConnection("Data Source=yaMAHDY.sqlite;version=3;");
con.Open();
string q = "INSERT INTO ahadith ( id, matn1, matn2, book) VALUES ( null,'سلام', 'سلام', 'اصول کافی جلد 1') , ( null,'سلام', 'سلام', 'اصول کافی جلد 1')";
SQLiteCommand cmd = new SQLiteCommand(q, con);
cmd.ExecuteNonQuery();
con.Close();

دلتنگ اسمان
یک شنبه 21 آذر 1395, 10:29 صبح
سلام
کدها رو اینطوری بنویس :

INSERT INTO table_name (column1, column2)
SELECT 'value1', 'value2'
UNION SELECT 'value3', 'value4'
UNION SELECT 'value5', 'value6'

codedeveloper
سه شنبه 23 آذر 1395, 10:39 صبح
سلام،
اولا اینکه هم تبریک و هم موفق باشید برای شما در کارتون،
اگر میشد که کدهای اون بخشی رو که داره فایل رو اضافه میکنه میزاشتین میشد بهتر نظر داد، ولی بازم چیزایی که به نظرم میرسه رو میگم
اول به این دقت کنید که همه فایل ها رو بخونید تو حافظه و بعد اقدام به ثبت در دیتابیس کنید
دوم به این دقت کنید که داخل حلقه رو از کانکشن و باز کردن و بستن اون استفاده نکنید
سوم به متغیر های که استفاده میکنید تو حلقه حواستون باشه که به طور تکراری هی ایجاد نشن و درست و به موقع ریست بشن

چون به طور اصولی نباید این زمان رو طول بکشه، حالا اگه خیلی فایل ها بزرگ باشه و زیاد فوقش بکشه یکی دو دقیقه یا چیزی در این حدود...
بازم اگه بیشتر در مورد کارتون و کدهاش بفرمایین بیشتر کمک میکنم

محمد آشتیانی
سه شنبه 23 آذر 1395, 21:47 عصر
سلام
برای وارد کردن تعداد زیاد رکورد در sqlite از transaction استفاده کنید ، سرعت شما بطور قابل توجهی بالا خواهد رفت.
ضمن اینکه دوستمون اشاره خوبی داشتن ، اگر تک تک هم رکورد ها رو ثبت می کنید ، کانکشن رو یکبار قبل از حلقه باز کنید و بعد از حلقه ببندید.

موفق باشید.

windowsyar
سه شنبه 23 آذر 1395, 22:51 عصر
سلام،
اولا اینکه هم تبریک و هم موفق باشید برای شما در کارتون،
اگر میشد که کدهای اون بخشی رو که داره فایل رو اضافه میکنه میزاشتین میشد بهتر نظر داد، ولی بازم چیزایی که به نظرم میرسه رو میگم
اول به این دقت کنید که همه فایل ها رو بخونید تو حافظه و بعد اقدام به ثبت در دیتابیس کنید
دوم به این دقت کنید که داخل حلقه رو از کانکشن و باز کردن و بستن اون استفاده نکنید
سوم به متغیر های که استفاده میکنید تو حلقه حواستون باشه که به طور تکراری هی ایجاد نشن و درست و به موقع ریست بشن

چون به طور اصولی نباید این زمان رو طول بکشه، حالا اگه خیلی فایل ها بزرگ باشه و زیاد فوقش بکشه یکی دو دقیقه یا چیزی در این حدود...
بازم اگه بیشتر در مورد کارتون و کدهاش بفرمایین بیشتر کمک میکنم


سلام
برای وارد کردن تعداد زیاد رکورد در sqlite از transaction استفاده کنید ، سرعت شما بطور قابل توجهی بالا خواهد رفت.
ضمن اینکه دوستمون اشاره خوبی داشتن ، اگر تک تک هم رکورد ها رو ثبت می کنید ، کانکشن رو یکبار قبل از حلقه باز کنید و بعد از حلقه ببندید.

موفق باشید.

خیلی خیلی متشکر همین که به این نرم افزار نگاه انداختید
من از کد آقای دلتنگ آسمان استفاده کردم و همچنین نکات آقای codedeveloper را رعایت کردم
فقط یک مشکلی دارد می خواهم همه را با یک دستور insert وارد دیتابیس کنم
که چون حجم فایل txt خیلی زیاد است ارور too many terms in compound SELECT می دهد
حال می خواهم با یک حلقه for متن درون فایل txt را به دستورات 100 تایی تبدیل کنم و هر دستور که شامل 100 حدیث یعنی 100 خط است را ارسال کنم
واقعا دیگر گیج شده ام و نمی دانم چگونه یک حلقه برای این کار ایجاد کنم
کد ها :

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 == Windows.Forms.DialogResult.OK)
{
System.Text.UnicodeEncoding d = new System.Text.UnicodeEncoding();
byte[] b = null;
string[] aaa = null;


b = System.IO.File.ReadAllBytes(LoadText.FileName);
b = System.Text.UnicodeEncoding.Convert(System.Text.En coding.Default, System.Text.Encoding.Unicode, b);
aaa = (d.GetString(b)).Split(Environment.NewLine);

تا این جا با این کد های سبز متن از داخل فایل تکس به درون آرایه آورده می شود هر خط فایل درون یک آرایه قرار دارد

با استفاده از حلقه زیر من دستور را می سازم چون تمامی آرایه به یک دستور اینسرت تبدیل می شود در نتیجه خیلی بزرگ می شود و برنامه اخطار میدهد می خواهم دستورات هر 100 خط آرایه را با یک دستور اراسل کنم که نمی دانم چکار باید بکنم
وگیج شدم
امیدوارم شما گیج نشوید

string m = "";

for (int n = 0; n < aaa.Count(); n++)
{
aaa[n] = aaa[n].Replace("\n", "");

if (n == aaa.Count() - 1)
{
m = m + " null , '" + aaa[n] + "' , '" + TrimE(aaa[n]) + "' , '" + Label4.Text + "'";
}
else
{
m = m + " null , '" + aaa[n] + "' , '" + TrimE(aaa[n]) + "' , '" + Label4.Text + "' UNION SELECT ";
}
}
SQLiteConnection con = new SQLiteConnection("Data Source=yaMAHDY.sqlite;version=3;");
con.Open();
string q = "INSERT INTO ahadith ( id, matn1, matn2, book) SELECT " + m;
SQLiteCommand cmd = new SQLiteCommand(q, con);
cmd.ExecuteNonQuery();
con.Close();
}
else
{
LoadText.Dispose();
}

hamid_hr
چهارشنبه 24 آذر 1395, 11:07 صبح
خب خطا رو و مقدار متغییر q رو بزارید ببینیم چطو شده

codedeveloper
چهارشنبه 24 آذر 1395, 16:32 عصر
دوست عزیز همینطور که جناب آشتیانی هم فرمودن از Transaction استفاده کنید و هر کدام از سطر های رو که از فایل میخونید به عنوان یک Insert وارد کنید، به خاطر وجود Transaction همش یکجا و درست وارد میشود و سرعت بالایی هم خواهد داشت و این خطای Too many رو هم نمیده...
موفق باشید

windowsyar
چهارشنبه 24 آذر 1395, 21:59 عصر
دوست عزیز همینطور که جناب آشتیانی هم فرمودن از Transaction استفاده کنید و هر کدام از سطر های رو که از فایل میخونید به عنوان یک Insert وارد کنید، به خاطر وجود Transaction همش یکجا و درست وارد میشود و سرعت بالایی هم خواهد داشت و این خطای Too many رو هم نمیده...
موفق باشید
درباره Transaction تحقیق کردم ولی زیاد متوجه چیزی نشدم
می شود شما بگویید الان برای این که بخواهم چند تا insert را با هم با Transaction ارسال کنم
باید چه کدی بنویسم ؟

csharpcollegian
چهارشنبه 24 آذر 1395, 22:32 عصر
سلام دوست عزیز
می تونید از TransactionScope استفاده کنید. به این صورت :

using (TransactionScope Scope = new TransactionScope())
{
.
. // Your Code
.
Scope.Complete();
}

موفق باشید

windowsyar
پنج شنبه 25 آذر 1395, 06:46 صبح
ببخشید خیلی در سایت ها و تاپیک ها گشتم
ولی هر کدام روش خاصی دارند نمی شود فهمید الان باید چکار کرد
لطفا به کد های من نگاه کنید
چه تغییری باید بدهم ؟
یعنی چه ارتباطی باید بین scope و کد های من باشد ؟
بدیهی است که هنوز خطای too many terms in compound SELECT می دهد.

using (TransactionScope scope = new TransactionScope())
{
string m = ""; // در این متغییر کوئری قرار می گیرد یک کوئری 1000 خطی
for (int n = 0; n < aaa.Count; n++) // در اینجا کل آرایه تبدیل به کوئری می شود
{
aaa(n) = aaa(n).Replace("\n", "");

if (n == aaa.Count - 1)
{
m = m + " null , '" + aaa(n) + "' , '" + TrimE(aaa(n)) + "' , '" + Label4.Text + "'";
}
else
{
m = m + " null , '" + aaa(n) + "' , '" + TrimE(aaa(n)) + "' , '" + Label4.Text + "' UNION SELECT ";
}
}
SQLiteConnection con = new SQLiteConnection("Data Source=yaMAHDY.sqlite;version=3;");
con.Open();

string q = "INSERT INTO ahadith ( id, matn1, matn2, book) SELECT " + m; //و در آخر کوئری درون دیتابیس قرار می گیرد
SQLiteCommand cmd = new SQLiteCommand(q, con);
cmd.ExecuteNonQuery();

con.Close();

scope.Complete();

}



البته کد بالا که منطقی نیست از سایت های خارجی این کد را نوشتم که بازهم همان خطا را داد


Dim m As String = ""





Dim conn As SQLiteConnection = New SQLiteConnection("Data Source=yaMAHDY.sqlite;version=3;")


conn.Open()
Using tran As IDbTransaction = conn.BeginTransaction()
Try
' transactional code...
Using cmd As SQLiteCommand = conn.CreateCommand()
For n As Integer = 0 To aaa.Count - 1


aaa(n) = aaa(n).Replace(vbLf, "")


If n = aaa.Count - 1 Then
m = m & " null , '" & aaa(n) & "' , '" & TrimE(aaa(n)) & "' , '" & Label4.Text & "'"
Else
m = m & " null , '" & aaa(n) & "' , '" & TrimE(aaa(n)) & "' , '" & Label4.Text & "' UNION SELECT "
End If


Next
cmd.CommandText = "INSERT INTO ahadith ( id, matn1, matn2, book) SELECT " & m
cmd.Transaction = TryCast(tran, SQLiteTransaction)
cmd.ExecuteNonQuery()
End Using
tran.Commit()
Catch ex As Exception
tran.Rollback()
Throw
End Try
End Using

codedeveloper
پنج شنبه 25 آذر 1395, 11:47 صبح
SqlConnection connection1 = new SqlConnection("...")
connection1.Open();

SqlTransaction sqlTran = connection1.BeginTransaction();

SqlCommand command = connection1.CreateCommand();
command.Transaction = sqlTran;

try
{
foreach loop به ازای هر کدام از ردیفهای موجود در فایل
{
command.CommandText =
"insert into ... values (...)";
command.ExecuteNonQuery();
}
sqlTran.Commit();

}
catch (Exception ex)
{
sqlTran.Rollback();
}
همونطور که قبلا هم عرض کردم همه فایل رو خونده و در یک کالکشنی چیزی ذخیره کنید، بعد به این ترتیبی که نوشتم کدهاتون رو تغییر بدین

windowsyar
پنج شنبه 25 آذر 1395, 19:13 عصر
سلام
واقعا از همه ممنون برای کمک هاتون
نرم افزار رو تا اینجا که انجام دادم گذاشتم در بالای تاپیک اگر خواستید دانلود کنید
--------------
یک سوال کوچک گرافیکی
در عکس زیر من یک دیتا گرید ویو دارم
قصد من این بود که این دیتا گرید ویو چند خطی باشه ولی تو این حجم اطلاعات چند خطی بودن هنگ می کند
به نظرتون چه حالتی باشد که هم خوانا باشد هم هنگ نکند.
چون در این حالت زیاد خوانا نیست در حالت چند خطی هم هنگ می کند