PDA

View Full Version : ایجاد بانک بدون کانکشن



janbozorgi
دوشنبه 11 بهمن 1389, 07:14 صبح
با سلام به همه اساتید
بنده قصد دارم برنامه خود را بصورت نصبی درآوردم و این مستلزم آن است که بانک اطلاعاتی خود را نیز همراه برنامه داشته باشم تا در یک کامپیوتر کلاینت دیگر، برنامه اجرا شود. برای این منظور راه حل های مختلفی را تست کردم از جمله هنگام ساختن پک نصبی ابتدا sqlexpress را نصب میکنم و بعد بانک (که بصورت mdf) است را نیز در مسیر فایل اجرایی قرار میدهم ولی این امر جواب نداد. بعد راه حل های مختلف... . بنظرم رسید که یک اسکریبت ایجاد بانک و جداول و ویوهایم را در یک فایل تکست قرار دهم و در پک نصبی ابتدا sqlexpress را نصب کنم و بعد فایل تکست خود را با کمک دستورات سی شارپ اجرا کنم تا بانک و محتویات اولیه آن نصب شود که بنظر راه بدی نمیرسد. اما سوال اینجاست که به چه شکلی این کار را انجام بدهم، یعنی بدون برقراری اتصال این دستورات sql اجرا کنم که در بانک sqlexpress بنشینند.
ممنون میشوم دوستان از هیچ کمکی دریغ نورزند و در مورد این سوال کمک کنند و اگر راه حل بهتری دارند نیز ارائه فرمایند.
در پناه خداوند باشید

Reza_Yarahmadi
دوشنبه 11 بهمن 1389, 07:52 صبح
در صورتي كه بانك رو با MSSQL ساخته باشيد و كانكشن استرينگ رو طبق اون ساخته باشيد نميتونيد از SQLExpress استفاده كنيد. بايد تمام كانكشن استرينگ هاي برنامه رو به حالت Express تغيير بديد تا اين كار شدني باشه.
ساخت اسكريپت و اجراي اون براي ايجاد ساختار ديتابيس هم بر روي MSSQL قابل انجام است.
براي شما راحتترين كار قرار دادن فايلهاي ديتابيس (هم mdf و هم ldf) كنار فايل اجرايي ، تغيير كانكشن استرينگ برنامه و قرار دادن پك SQL Express در فايل ستاپ برنامه است.

janbozorgi
دوشنبه 11 بهمن 1389, 09:10 صبح
با تشکر
ولی سوال اینجاست که اولا اگر بانک رو هم در MSSQL ساخته باشم آیا امکان attach کردن نیست؟
و دوما با توجه به راهنمایی شما چگونه میشود در برنامه (قبل از ساخت exe) رشته اتصال را به بانکی که در مسیر فایل اجرایی قرار داد متصل شد و sqlexpress رو ملزم ساخت که از این بانک دیتا را بخواند:
بر فرض بانکی با نام بروجرد ایجاد کردم و سعی کردم با رشته اتصال زیر به آن متصل بشوم ولی نشد.


cnn.ConnectionString = @"Provider=SQLOLEDB.1;Data Source=.\SQLEXPRESS;AttachDbFilename=" + System.IO.Directory.GetCurrentDirectory() + @"\BORUJERD.MDF" + ";Integrated Security=SSPI;Initial Catalog=BORUJERD;Connect Timeout=30;User Instance=True";

Reza_Yarahmadi
دوشنبه 11 بهمن 1389, 09:23 صبح
ولی سوال اینجاست که اولا اگر بانک رو هم در MSSQL ساخته باشم آیا امکان attach کردن نیست؟
در صورتيكه روي سيستم كاربر MSSQL نصب باشه ميتونيد با دستور SQL ديتابيس رو Attach كنيد. MSSQL رو هم با ستاپ VS نميتونيد به فايل نهايي اضافه كنيد.

چگونه میشود در برنامه (قبل از ساخت exe) رشته اتصال را به بانکی که در مسیر فایل اجرایی قرار داد متصل شد و sqlexpress رو ملزم ساخت که از این بانک دیتا را بخواند
كانكشن استرينگ رو بصورت زير تغيير بديد. (براي ساخت كانكشن استرينگ ميتونيد از ConnectionStringBuilder استفاده كنيد.)

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\BORUJERD.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

janbozorgi
دوشنبه 11 بهمن 1389, 11:08 صبح
در صورتيكه روي سيستم كاربر MSSQL نصب باشه ميتونيد با دستور SQL ديتابيس رو Attach كنيد. MSSQL رو هم با ستاپ VS نميتونيد به فايل نهايي اضافه كنيد.

كانكشن استرينگ رو بصورت زير تغيير بديد. (براي ساخت كانكشن استرينگ ميتونيد از ConnectionStringBuilder استفاده كنيد.)

Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\BORUJERD.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

دوست گرامی؛ بله به این شکل هست که شما فرموده اید. ولی چند نکته هست که باید مد نظر گرفت، که گفتم بد نیست توی همین تاپیک گفته بشه که اگر دیگران هم نیاز داشتند استفاده کنند:
اول اینکه حتما میبایست نوع دستور را تکست قرار داد
دوم اینکه از SqlClient استفاده بشه چون به OleDb من نتونستم(چون Provider , تنظیمات دیگه ای میخواهد...)
سوم اینکه بانکتون رو توی مسیر اجرایی (فایل exe) قرار داد.
در زیر هم کد رو همراه با کوئری استرینگش آوردم:


string aa = System.IO.Directory.GetCurrentDirectory();
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + aa + @"\Ali.mdf;Integrated Security=True;User Instance=True";
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from tblInfo";
con.Open();
System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
string a = "";
while (dr.Read())
{
a = dr.GetString(1);
}
con.Close();
MessageBox.Show(a.ToString());


دوستان کد رو خودشون اپتیمایز کنند.
با تشکر