PDA

View Full Version : سوال: Attach کردن DataBase



viper2009
سه شنبه 14 مهر 1388, 22:20 عصر
سلام
می خوام وقتی برنامه ام رو در هر کامپیوتری کهاجرا می کنم دیتابیسم هم اتوماتیک وار به SQLServer2005 اضافه بشه.

viper2009
سه شنبه 14 مهر 1388, 23:00 عصر
این کد از سی شارپ در تالار بود تبدیلش کردم به وی بی کار می کنه ولی در SQLEXPRESS Attach نمی کنه در یک سرور دیگه Attach می کنه


Try


Dim Con AsNew SqlConnection


Con.ConnectionString = "Data Source=(local);Initial Catalog=master;Integrated Security=True"


Con.Open()


Dim str AsString = "use master;" & "EXECUTE sp_attach_db @dbname = N'VIPER' , " & " @filename1 = N'" + System.Environment.CurrentDirectory + "\\Db.mdf'," & "@filename2 = N'" + System.Environment.CurrentDirectory + "\\Db_log.ldf'"


Dim cmd AsNew SqlCommand(str, Con)


cmd.ExecuteNonQuery()


Con.Close()


MessageBox.Show(" Attach ")


Catch ex As Exception


If (ex.Message.IndexOf("already exists") >= 0) Then


MessageBox.Show(


" ")



Else


MessageBox.Show(ex.Message)
EndIf


EndTry



چطوری Local رو به SQLExpress عوض کنم؟

saadi2
سه شنبه 14 مهر 1388, 23:05 عصر
"Data Source=.\sqlexpress;"

viper2009
سه شنبه 14 مهر 1388, 23:14 عصر
"Data Source=.\sqlexpress;"


ممنون
ولی خطای Login می ده دیتا بیسم هم User و pass نداره

saadi2
سه شنبه 14 مهر 1388, 23:19 عصر
PublicConst conString AsString = "Server=.\sqlexpress;" & _
"Integrated Security=SSPI;" & _
"uid=sa;pwd=;database=master"

saadi2
سه شنبه 14 مهر 1388, 23:22 عصر
Const conString As String = _
"Server=.\sqlexpress;" & _
"Integrated Security=true;" & _
"DataBase="
'--------------------------------------------------------------------------------------------------
Dim Con As New SqlClient.SqlConnection(conString & "'master'")
Dim cmd As New SqlClient.SqlCommand
Dim txt As String
Dim SF, sf2 As New SaveFileDialog
'--------------------------------------------------------------------------------------------------
SF.Filter = " SQL EXPRESS DB (*.mdf)|*.mdf"
sf2.Filter = "SQL EXPRESS DB_log (*.ldf)|*.ldf"
SF.ShowDialog()
sf2.ShowDialog()
'--------------------------------------------------------------------------------------------------
Try
If Len(SF.FileName) > 0 And Len(sf2.FileName) > 0 Then
txt = "sp_attach_db @dbname = N'" + TextBox2.Text + "', " & _
"@filename1 = N'" + SF.FileName + " ', " & _
"@filename2 = N'" + sf2.FileName + " ' "
Con.Open()
cmd.CommandText = txt
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database attach successfully")
load1()
End If
Catch ex As Exception
End Try

viper2009
سه شنبه 14 مهر 1388, 23:27 عصر
PublicConst conString AsString = "Server=.\sqlexpress;" & _
"Integrated Security=SSPI;" & _
"uid=sa;pwd=;database=master"


نه کار نمی کنه

viper2009
سه شنبه 14 مهر 1388, 23:43 عصر
Const conString AsString = _
"Server=.\sqlexpress;" & _
"Integrated Security=true;" & _
"DataBase="
'--------------------------------------------------------------------------------------------------
Dim Con AsNew SqlClient.SqlConnection(conString & "'master'")
Dim cmd AsNew SqlClient.SqlCommand
Dim txt AsString
Dim SF, sf2 AsNew SaveFileDialog
'--------------------------------------------------------------------------------------------------
SF.Filter = " SQL EXPRESS DB (*.mdf)|*.mdf"
sf2.Filter = "SQL EXPRESS DB_log (*.ldf)|*.ldf"
SF.ShowDialog()
sf2.ShowDialog()
'--------------------------------------------------------------------------------------------------
Try
If Len(SF.FileName) > 0 And Len(sf2.FileName) > 0 Then
txt = "sp_attach_db @dbname = N'" + TextBox2.Text + "', " & _
"@filename1 = N'" + SF.FileName + " ', " & _
"@filename2 = N'" + sf2.FileName + " ' "
Con.Open()
cmd.CommandText = txt
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database attach successfully")
load1()
EndIf
Catch ex As Exception
EndTry


ممنون این جواب بود، فقط میشه بگی نقش master اینجا چیه ؟ و چرا اصلاً از آن استفاده می شه؟

saadi2
چهارشنبه 15 مهر 1388, 03:06 صبح
master در واقع دیتابیس مادر در داخل سرور هست که کارش کنترل و دادن اطلاعات بقیه دیتابیسهای سرور هست.

یعنی هر اتچ کردن یا تاریخ اون یا بکاپ گیری و ...... توسط این دیتابیس انجام میشه و در اون ثبت میشه.

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

viper2009
چهارشنبه 15 مهر 1388, 12:21 عصر
دوست من سلام

ممنون از راهنمایی هاتون

یک سوال دیگه : اگه بخوام همین دیتا بیس رو حذف کنیم چطوریه ؟
در حقیقت چون دیتا بیسم هر چند وقت یک بار آپدیت می شه می خواهم در ابتدای برنامه دیتا بیس قبلی رو حذف و دیتا بیس جدید رو Attach کنم

حال در یک برنامه جدید یا در خود برنامه.

آیا این منطقی هم هست؟

این کد هم پیاده کردم ولی معلوم نیست چی رو حذف می کنه؟


Const conString As String = "Server=.\sqlexpress;Integrated Security=true;DataBase
="


Try


Dim Con As New SqlClient.SqlConnection(conString & "'master'")

Con.Open()

Dim cmd As New SqlClient.SqlCommand("IF EXISTS(SELECT name FROM master.dbo.sysdatabases WHERE name = N'CmdDeleteDb') DROP DATABASE CmdDeleteDb", Con)

cmd.ExecuteNonQuery()

MsgBox(" حذف گردید")

Finally


Con.Close()

End Try

saadi2
چهارشنبه 15 مهر 1388, 12:27 عصر
Dim cmd As New SqlClient.SqlCommand
Dim txt As String
Dim Con As New SqlClient.SqlConnection(conString & "'master'")
Con.Open()
txt = "sp_detach_db @dbname = N'database1', @keepfulltextindexfile=N'true'"
cmd.CommandText = txt
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database detach successfully")

viper2009
چهارشنبه 15 مهر 1388, 12:57 عصر
آقا شرط اینکه بخواهیم با یک دکمه هر دو این کار ها رو انجام بدیم چیه؟
طوری که کاربر متوجه نشه داره Attach و Delete صورت می گیره .

saadi2
چهارشنبه 15 مهر 1388, 13:59 عصر
آقا شرط اینکه بخواهیم با یک دکمه هر دو این کار ها رو انجام بدیم چیه؟
طوری که کاربر متوجه نشه داره Attach و Delete صورت می گیره .


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



Public Class Form1
Public Const conString As String = "Server=.\sqlexpress;Integrated Security=true;DataBase="
Dim Con As New SqlClient.SqlConnection(conString & "'master'")
Public sql As String = Nothing
Public Ds As DataSet
Public Caa As New SqlClient.SqlDataAdapter
Dim cmd As New SqlClient.SqlCommand
Dim open1, open2 As New OpenFileDialog
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cmd2 = New SqlClient.SqlCommand
cmd2.CommandText = "select name from dbo.sysobjects where name = 'database1' "
Dim data As String = CType(cmd2.ExecuteScalar, String)
If data IsNot DBNull.Value Then
Try
cmd = New SqlClient.SqlCommand
Con.Open()
cmd.CommandText = "sp_detach_db @dbname = N'database1', @keepfulltextindexfile=N'true'"
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database detach successfully")
Catch ex As Exception
MsgBox(ex.Message)
End Try
Else
open1.Filter = " SQL EXPRESS DB (*.mdf)|*.mdf"
open2.Filter = "SQL EXPRESS DB_log (*.ldf)|*.ldf"
open1.ShowDialog()
open2.ShowDialog()
Try
If Len(open1.FileName) > 0 And Len(open2.FileName) > 0 Then
cmd = New SqlClient.SqlCommand
Con.Open()
cmd.CommandText = "sp_attach_db @dbname = N'database1', " & _
"@filename1 = N'" + open1.FileName + " ', " & _
"@filename2 = N'" + open2.FileName + " ' "
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database attach successfully")
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
End Class

viper2009
چهارشنبه 15 مهر 1388, 22:26 عصر
در این خط خطا می ده ExecuteScalar: Connection property has not been initialized.


cmd2.CommandText = "select name from dbo.sysobjects where name = 'database1' "
Dim data AsString = CType(cmd2.ExecuteScalar, String)

saadi2
چهارشنبه 15 مهر 1388, 23:27 عصر
اینو دیگه تست کردم جواب میده




Public Class Form1
Public Const conString As String = "Server=.\sqlexpress;Integrated Security=true;DataBase="
Dim Con As New SqlClient.SqlConnection(conString & "'master'")
Public sql As String = Nothing
Public Ds As New DataSet
Public Caa As New SqlClient.SqlDataAdapter
Dim cmd As New SqlClient.SqlCommand
Dim open1, open2 As New OpenFileDialog
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
cmd = New SqlClient.SqlCommand
cmd.CommandText = "sp_helpdb"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = Con
If Con.State = ConnectionState.Closed Then Con.Open()
Caa = New SqlClient.SqlDataAdapter
Caa.SelectCommand = cmd
Ds = New DataSet
Try
Caa.Fill(Ds, "sysdatabases")
Con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Dim dr() As DataRow = Ds.Tables("sysdatabases").Select("name='database1'")
If dr.Length <> 0 Then
Try
cmd = New SqlClient.SqlCommand
Con.Open()
cmd.CommandText = "sp_detach_db @dbname = N'database1', @keepfulltextindexfile=N'true'"
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database detach successfully")
Catch ex As Exception
MsgBox(ex.Message)
End Try
Else
open1.Filter = " SQL EXPRESS DB (*.mdf)|*.mdf"
open2.Filter = "SQL EXPRESS DB_log (*.ldf)|*.ldf"
open1.ShowDialog()
open2.ShowDialog()
Try
If Len(open1.FileName) > 0 And Len(open2.FileName) > 0 Then
cmd = New SqlClient.SqlCommand
Con.Open()
cmd.CommandText = "sp_attach_db @dbname = N'database1', " & _
"@filename1 = N'" + open1.FileName + " ', " & _
"@filename2 = N'" + open2.FileName + " ' "
cmd.Connection = Con
cmd.ExecuteNonQuery()
Con.Close()
MsgBox("Database attach successfully")
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
End Class

viper2009
پنج شنبه 16 مهر 1388, 11:54 صبح
سلام دوست من

عجب تاپیک پر محتوای شده ها
بظر خودت کدام از این دو مورد بهتره و درصد خطای کم یا نداره
بطور جداگانه این کار رو انجام دادن یا اتومات؟

saadi2
پنج شنبه 16 مهر 1388, 21:53 عصر
سلام دوست من

عجب تاپیک پر محتوای شده ها
بظر خودت کدام از این دو مورد بهتره و درصد خطای کم یا نداره
بطور جداگانه این کار رو انجام دادن یا اتومات؟


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


به هر حال با توجه به نیاز برنامت یک راه و انتخاب کن