PDA

View Full Version : چک کردن وجود دیتابیس در SQLEpress و Attach کردن آن



razavi_university
یک شنبه 08 اردیبهشت 1387, 11:26 صبح
سلام
من می خوام برنامه ام هر موقع که اجرا میشه وجود دیتابیسش رو در SQLExpress چک کنه و در صورتی که Attach نبود اون رو Attach کنه
واسه اینکار این کد رو نوشتم ولی جواب نمیده! چه مشکلی داره؟



public FrmMain()
{
InitializeComponent();

}
private void FrmMain_Load(object sender, EventArgs e)
{
checkDB();
}
private void checkDB()
{
string masterCS = Properties.Settings.Default.csMas;//Connection string to Master DB
DataBase.Database db = new DataBase.Database(masterCS);
db.connect();
DataTable dt = db.select("select name from sysdatabases where name = ' My DB Name ' ");
if (!(dt.Rows.Count>0))
{
//MessageBox.Show("بانک اطلاعاتی برنامه در پایگاه داده قرار ندارد \n لطفا تا قرارگیری آن کمی مننظر بمانید","خطا",MessageBoxButtons.OK,MessageBoxIcon.Error);
attachDB();

}
db.disconnect();
}
private void attachDB()
{
SqlCommand cmd = new SqlCommand();
string masterCS = Properties.Settings.Default.csMas;
DataBase.Database db = new FSCO.DataBase.Database(masterCS);
db.connect();
db.connect();
string strCmd = "EXECUTE sp_attach_db @dbname,@filename1,@filename2";
cmd.CommandText = strCmd;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@dbname", "Fanavaran");
cmd.Parameters.AddWithValue("@filename1", Application.StartupPath + "\\db\\Fanavaran.mdf (file://\\db\\Fanavaran.mdf)");
cmd.Parameters.AddWithValue("@filename2", Application.StartupPath + "\\db\\Fanavaran_log.ldf (file://\\db\\Fanavaran_log.ldf)");

//connectionstr="Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True";

db.doSPU1(cmd);
db.disconnect();
}
}
}

آیا اصلا این روش عاقلانه است ؟:متفکر:

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

hdv212
یک شنبه 08 اردیبهشت 1387, 11:42 صبح
ما توی Sql Server چیزی به نام sysdatabase نداریم، باید بینش نقطه بذاری، اینطوری :

sys.databases
اینم یه نمونه کد برای پیدا کردن دیتابیس مورد نظر :

declare @x varchar(20)
set @x = 'Northwind'
if exists (select * from sys.databases where name=@x)
print (@x + ' Exists.')
else
print (@x + ' Does not exists')

علیرضا مداح
یک شنبه 08 اردیبهشت 1387, 12:15 عصر
سلام دوست عزیز ،


ما توی Sql Server چیزی به نام sysdatabase نداریم، باید بینش نقطه بذاری، اینطوری :


sysdatabases مخصوص SQL Server 2000 است ،

در ضمن شما میتوانید عملیات مورد نظر خود را با بهره گیری از SQL Server System Management Object نیز انجام دهید ، بدینمنظور اسمبلی های زیر را به پروژه اضافه کنید :
Microsoft.SqlServer.Smo
Microsoft.SqlServer.ConnectionInfo

هم اکنون میتوانید از کلاس Microsoft.SqlServer.Management.Smo.Server و پروپرتی Databases برای بدست آوردن دیتابیس های موجود و متد AttachDatabase استفاده نمایید.

razavi_university
یک شنبه 08 اردیبهشت 1387, 15:36 عصر
ما توی Sql Server چیزی به نام sysdatabase نداریم، باید بینش نقطه بذاری، اینطوری :

sys.databases

البته بدون نقطه اش هم جواب میده :چشمک:
آیا این کدها در SQLExpress هم جواب می دهند و این جدوال در SQLExpress هم وجود دارند؟
چطور میشه این دستورات فقط برای SQLExpress کار کنند، یعنی دیتابیس های SQL Server را نیاورد؟

razavi_university
دوشنبه 09 اردیبهشت 1387, 23:05 عصر
ما توی Sql Server چیزی به نام sysdatabase نداریم، باید بینش نقطه بذاری، اینطوری :

sys.databasesاینم یه نمونه کد برای پیدا کردن دیتابیس مورد نظر :

declare @x varchar(20)
set @x = 'Northwind'
if exists (select * from sys.databases where name=@x)
print (@x + ' Exists.')
else
print (@x + ' Does not exists')
آيا اين دستورات در SQLExpress جواب مي‌دهد. در ConnectionString بايد به چه ديتابيسي وصل بشم؟ Master ؟

Mahdi-563
دوشنبه 09 اردیبهشت 1387, 23:31 عصر
فكر نكنم نياز به انتخاب جدول باشه. يه بار تست كن بدون انتخاب جدول

razavi_university
سه شنبه 10 اردیبهشت 1387, 00:08 صبح
من اشتباه تايپي كردك كه اصلاحش شد.
منظورم اين بود كه به چه ديتابيسي وصل بشم؟

gdevnb
سه شنبه 10 اردیبهشت 1387, 00:22 صبح
آيا اين دستورات در SQLExpress جواب مي‌دهد. در ConnectionString بايد به چه ديتابيسي وصل بشم؟ Master ؟



con = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Master;Integrated Security=True");
com = new SqlCommand("select * from sys.databases where name= 'DB'", con);
con.Open();
object obj = com.ExecuteScalar();
if (obj != null)
{
//attach
}

con.Close();

razavi_university
چهارشنبه 11 اردیبهشت 1387, 00:59 صبح
با تعمق و تامل و كدنويسي فراوان و مكاشفه در كدهايي كه دوستان لطف كردن مشكل حل شد.:چشمک:
براي اينكار يك تابع checkDB در نظر گرفتم كه موقع لود شدن اولين فرم برنامه (مثلا Splash) اجرا بشه و وجود ديتابيس رو چك بكنه و در صورتي كه Attach نباشد آنرا Attach كند.


private void checkDB()
{
string csMaster = "Data Source=.\sqlexpress;Initial Catalog=Master;Integrated Security=True";
SqlConnection con = new SqlConnection(csMaster);
SqlCommand com = new SqlCommand("select * from sys.databases where name= 'DBx'", con);
con.Open();
object obj = com.ExecuteScalar();
if (obj == null)
{
MessageBox.Show("بانک اطلاعاتی برنامه در پایگاه داده قرار ندارد \n لطفا تا قرارگیری آن کمی مننظر بمانید","خطا",MessageBoxButtons.OK,MessageBoxIcon.Error);
string strCmd = "EXECUTE sp_attach_db @dbname,@filename1";
com.CommandText = strCmd;
com.Parameters.Clear();
com.Parameters.AddWithValue("@dbname", "DBx");
com.Parameters.AddWithValue("@filename1", Application.StartupPath + @"\DataBase\DBx.mdf");
com.ExecuteNonQuery();

com.CommandText = "select * from sys.databases where name= 'DBx'";
obj = com.ExecuteScalar();
if (obj != null)
{
MessageBox.Show("بانک اطلاعاتی با موفقیت بارگزاری شد");
}
}
con.Close();
}
براي ارتباط برنامه با ديتابيس هم از اين ConnectionString استفاده مي‌كنيم:


Data Source=.\SQLEXPRESS;Initial Catalog=DBx;Integrated Security=True
براي اينكه بدونين الان ديتابيس تون در SQLExpress وجود دارد يا نه مي‌تونين از ManagementStudio استفاده كنين، فقط بايد براي لوگين بعد از اسم سرورتون SQLExpress رو اضافه كنين به اين صورت:

به جاي DBx در كدهاي بالا اسم ديتابيس خودتون رو بگذاريد

joojoo
سه شنبه 26 آذر 1387, 14:17 عصر
آقای Razavi واقعا ممنون از راه حلتون.عالی بود .بازم ممنون.

Dr.Saeed
جمعه 06 دی 1387, 06:53 صبح
سلام دوستان
میشه بصورت پایه ای راهنمایی کنین چطوری دیتابیس را attach کنیم؟ من کدهای آقای رضوی را در فرم لود برنامه ام نوشتم ولی روی همان سیستمی که برنامه را باهاش نوشتم هم اجرا نشد !
آیا کارهای دیگری غیر از نوشتن کدهای بالا در قسمت فرم لود باید انجام بدهیم.
با تشکر