ورود

View Full Version : اس کیو ال و بانک اتچ نشده



farzinf
دوشنبه 24 مرداد 1390, 13:08 عصر
سلام دوستان

من با این کد به بانکه اس کیو ال سرور 2008 کانکت می شم :


Public Conn As ADODB.Connection
Public Rst As ADODB.Recordset
Public SQLQuery As String

Option Explicit

Public Sub LoadAll()

Set Rst = New ADODB.Recordset

Connect

Rst.Source = SQLQuery
Rst.ActiveConnection = Conn
Rst.CursorType = adOpenKeyset
Rst.LockType = adLockOptimistic
Rst.Open

End Sub


Public Sub Connect()

Set Conn = New ADODB.Connection

Conn.Provider = "SQLOLEDB.1"
Conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=basedata;Persist Security Info=True;User ID=sa;Password=123"
Conn.CursorLocation = adUseClient
Conn.Open

End Sub


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


Public Sub main()
SQLQuery = "select * from sys.databases where name='basedata'"
Call LoadAll
If Rst.RecordCount = 1 Then
Price_Azad_Del.Show
Else
MsgBox " .ÏíÊÇ ÈíÓ ãæÑÏ äÙÑ Ñæí ÓÑæÑ ãæÌæÏ äãí ÈÇÔÏ ", , "ÎØÇ"
End If
End Sub


اگه بانک اتچ باشه که هیچ مشکلی نیست

ولی اگه بانک اتچ نباشه چون تو این کد اینجا


Conn.ConnectionString = "Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=basedata;Persist Security Info=True;User ID=sa;Password=123"


گفتیم که با بانک برنامه یعنی basedata ارتباط برقرار کنه چون این بانک اتچ نشده به مشکل می خوره

حالا خودم به این نتیجه رسیدم که بیام یه متغیر تعریف کنم اول برنامه نام بانک اطلاعاتی رو یکی از بانک اطلاعاتی هایی که با خود اس کیو ال نصب میشه بزارم (مثلا maser) و بعد چک کنم ببینم بانک برنامه اتچ شده یا نه اگه اتچ شده بود بعد بیام نام بانک برنامه رو عوض کنم ولی اینم خودش یه مشکل داره مشکلشم اینه اگه اون بانک هم روی سرور نباشه بازم به مشکل می خوریم

دوستان اگه نظر خواصی دارین لطفا دریغ نکنید

Reza_Yarahmadi
دوشنبه 24 مرداد 1390, 18:15 عصر
دیتابیس master جزء دیتابیس های اصلی SQL Server است و در صورت حذف اون SQL Server به مشکل بر میخوره. در حالت عادی و با استفاده از Management Studio هم نمیشه این بانک رو حذف کرد ، فایلش رو هم سرویس SQL Server در اختیار میگیره و اجازه حذفش رو نمیده. پس تقریبا با خیال راحت از این دیتابیس استفاده کنید.

farzinf
دوشنبه 24 مرداد 1390, 20:39 عصر
تشکر بابت اینکه جواب دادین

من از این روش استفاده کردم ولی به نظرم این روش ، روش منطقی نیست باید حتما روشی دیگه هم باشه باز هم با تشکر فراوان

دوستای دیگه نظری ندارن؟

Galawij
سه شنبه 25 مرداد 1390, 09:33 صبح
حق با شماست دوست عزیز، اصلاً روش منطقی به نظر نمی یاد.
شما اول چک کنید ببینید دیتابیس شما Attach شده است یا نه؟ اگر جواب منفی بود. از طریق دستورات (SMO (SQL Management Object مربوط به خود NET. در یک فرمی مسیر بانک را از کاربر دریافت کنید و از طریق این دستورات بانک اطلاعاتی را از مسیر داده شده Attach کنید.

Reza_Yarahmadi
سه شنبه 25 مرداد 1390, 17:51 عصر
دوست من برای بدست آوردن نام بانکهای اتچ شده نیازی به آوردن نام دیتابیس خاصی در کانکشن استرینگ نیست
کد زیر رو به VB تبدیل کنید و تست کنید
SqlConnection con = new SqlConnection("Data Source=.;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter("Select * From sys.Databases", con);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
در ضمن با استفاده فضای نام SMO هم میتونید لیست دیتابیس های موجود رو بدست بیارید
ابتدا رفرنس های زیر و به پروژه اضافه کنید
Microsoft.SqlServer.Smo
Microsoft.SqlServer.ConnectionInfo
سپس
using Microsoft.SqlServer.Management.Smo;
Server server = new Server(".");
if(server.Databases["YourDatabaseName"]!=null)
MessageBox.Show("Database Available");
else
MessageBox.Show("Database Not Available");