PDA

View Full Version : بررسی موجود بودن database در اسکیوال سرور



samiasoft
چهارشنبه 04 بهمن 1396, 00:48 صبح
سلام دوستان

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

bool dbExists = System.Data.Entity.Database.Exists(database.Databa se.Connection);
MessageBox.Show(dbExists.ToString());

که این کد درصورتی جواب میده که از انتیتی فریمورک استفاده کرده باشیم.

حال بدون انتیتی فریمورک با استفاده از ado.net یا ...چگونه این دستور رو بنویسیم ؟

بدین صورت اومدم نوشتم ااما وقتی دیتابیس وجود نداشته باشد دستورات به درستی کار نمیکند یعنی پیغام نمایش داده نمیشود. به نظرتون چگونه اینو اصلاح کنیم؟

SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS; Initial Catalog = saaaaa; Integrated Security = True");


conn.Open();
if (conn.State==ConnectionState.Open)
{
MessageBox.Show("وجود دارد");


}
else
{


MessageBox.Show("وجود ندارد");
}

parvizwpf
چهارشنبه 04 بهمن 1396, 08:19 صبح
بخش Open رو داخل بلاک try بندازید و ترو برگردونید و در بخش catch هم فالس برگردونید.

NasimBamdad
چهارشنبه 04 بهمن 1396, 09:01 صبح
حالا به فرض اینکه وجود نداشت ، چه طوری باید Restore کرد ؟

رامین مرادی
چهارشنبه 04 بهمن 1396, 10:01 صبح
حالا به فرض اینکه وجود نداشت ، چه طوری باید Restore کرد ؟

خب اگه فالس برگشت داده شد ابتدا یک دیتابیس ایجاد کن با نام مورد نظر بعد دیتابیس رو ریستور کن.

NasimBamdad
چهارشنبه 04 بهمن 1396, 10:03 صبح
خب اگه فالس برگشت داده شد ابتدا یک دیتابیس ایجاد کن با نام مورد نظر بعد دیتابیس رو ریستور کن.

خوب فکر نمی کنم دیگه با کانکشن استرینگ فعلی بشه کار کرد .


.\SQLEXPRESS; Initial Catalog = saaaaa; Integrated Security = True"


باید عوض بشه ؟ از دیتابیس MASTER استفاده کنیم ؟!

رامین مرادی
چهارشنبه 04 بهمن 1396, 10:22 صبح
خوب فکر نمی کنم دیگه با کانکشن استرینگ فعلی بشه کار کرد .


.\SQLEXPRESS; Initial Catalog = saaaaa; Integrated Security = True"


باید عوض بشه ؟ از دیتابیس MASTER استفاده کنیم ؟!

بله باید از دیتا بیس مستر استفاده بشه

samiasoft
پنج شنبه 05 بهمن 1396, 08:56 صبح
بخش Open رو داخل بلاک try بندازید و ترو برگردونید و در بخش catch هم فالس برگردونید.

تشکر از شما ولی این دستور چرا طول میکشه...الان 10 ثانیه طول کشید تا چک کنه:ناراحت:اون دستور انتیتی فریمورک در عرض 1 ثانیه این کارو انجام داد

به نظرتون دستور سریعتری برای چک کردن نمیشه نوشت ؟

SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS; Initial Catalog = saaaaa; Integrated Security = True");

try
{
conn.Open();
MessageBox.Show("وجود دارد");
}
catch
{
MessageBox.Show("وجود ندارد");


}

فکر میکنم بایستی مقدار ConnectionTimeout رو کمتر کرد...بدین صورت نوشتم ولی کلا به این دستور خطا میگیره !

conn.ConnectionTimeout = 1;

محمد آشتیانی
پنج شنبه 05 بهمن 1396, 12:38 عصر
سلام
به این شکل

private bool CheckDatabaseExistance(string databaseName)
{
var result = false;


var sqlConnection = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Master;Persist Security Info=True;User ID=sa;Password=123;");
var sqlCommand = new SqlCommand
{
Connection = sqlConnection,
CommandText = $"SELECT COUNT(name) FROM master.dbo.sysdatabases WHERE name = N'{databaseName}'"
};


try
{
sqlConnection.Open();
result = (int)sqlCommand.ExecuteScalar() > 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sqlConnection.Close();
}


return result;
}



به این شکل هم از متد بالا استفاده کنید

if (CheckDatabaseExistance("YourDatabaseName"))
{
//دیتابیس موجود است
}
else
{
//دیتابیس موجود نیست
}



این در خیلی کمتر از یک ثانیه جواب میده :)

موفق باشید.

samiasoft
پنج شنبه 05 بهمن 1396, 13:07 عصر
ممنون جناب آشتیانی

بدین صورت من نوشتم ...اینم انگار به خوبی کار میکنه در عرض 1 ثانیه :لبخندساده:درواقع Connect Timeout=1 را داخل کانکشن قرار دادم



SqlConnection conn = new SqlConnection(@"Data Source =.; Initial Catalog = master; Integrated Security = True;Connect Timeout=1");

try
{
conn.Open();


MessageBox.Show("دیتابیس مربوطه وجود دارد");
}
catch
{
MessageBox.Show("دیتابیس مربوطه وجود ندارد");


}

محمد آشتیانی
پنج شنبه 05 بهمن 1396, 13:08 عصر
راهی که عرض کردم بهتره قربان

توضیح: یک ایراد روش شما این هست که ، فرض بفرمائید به دلیل کندی شبکه یا مثلا مشغول بودن Sql Server زمان دریافت پاسخ شما بیشتر از یک ثانیه بشود ، در اینصورت خطای تایم اوت اتفاق میفته برای شما که مقدار تایم اوت رو یک ثانیه ست کردی ، در حالی که احتمالا اون دیتابیس وجود داره اما شما خطا دریافت میکنی به دلیل دیگری.