PDA

View Full Version : Attach کردن DataBase به برنامه نصبی



boof1363
دوشنبه 08 بهمن 1386, 15:23 عصر
دوستان گرامی سلام
من یه برنامه با C# نوشتم که یه DataBase ولی نمی دونم چطوری این کارو انجام بدم که بعد از نصب برنامه دیگه نیاز به این نباشه که DataBase ام رو تو SqlServer،Attach کنم.ممنون میشم راهنمایی کنید

ali_kolahdoozan
دوشنبه 08 بهمن 1386, 16:21 عصر
به این سادگیها با install shield نمی تونی

boof1363
دوشنبه 08 بهمن 1386, 18:58 عصر
یعنی چی؟
از طریق Script این کار رو کردم ولی موقع نصب خطا میده

ehsan_zanganeh
پنج شنبه 11 بهمن 1386, 23:04 عصر
با سلام

چرا می خوای با ستاپ این کار رو بکنی. خوب این مسئله رو می تونی با run شدن برنامت چک کنی . و در ورتی که وجود نداشت اون دیتابیس رو ایجاد کنی و سپس بانک خالی رو restore کنی
می تونی از کد زیر هم استفاده کنی :



Private Sub Main_Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim farsi As New Globalization.CultureInfo("fa-IR")
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(farsi)

Me.date_now.Text = shamsi()
Me.name_roz.Text = shamsiweekdayname()
Me.time_now.Text = Now.TimeOfDay.ToString


mablagh_pardakhti_jahiziyeh.Top = 1

'===============================
'چک کردن وجود دیتابیس و در صورت وجود نداشتن
'اضافه نمودن دیتابیس و برگردان اطلاعات پایه
'===============================
Dim temp_cmd_ExecuteScalar As Integer
Dim cmd As New SqlClient.SqlCommand()

cmd.Connection = New SqlClient.SqlConnection("server=.;database=master;integrated security=true;")
cmd.CommandText = "SELECT count(*) FROM master..sysdatabases WHERE name = 'jahiziyeh_" + code_shakheh + "'"

Try
cmd.Connection.Open()
temp_cmd_ExecuteScalar = cmd.ExecuteScalar()
Catch ex As Exception
MsgBox("خطا در یافتن بانک اطلاعاتی ", MsgBoxStyle.Information, "سیستم جهیزیه")
MsgBox(ex.Message)
Exit Sub
Finally
cmd.Connection.Close()
End Try

If temp_cmd_ExecuteScalar = 0 Then
If MsgBox(" بانک اطلاعاتی شاخه" + code_shakheh + " وجود ندارد.آیا مایل به ساختن بانک اطلاعاتی هستید؟ ", MsgBoxStyle.YesNo, "سیستم جهیزیه") = MsgBoxResult.Yes Then
cmd.Connection = New SqlClient.SqlConnection("server=.;database=master;integrated security=true;")
cmd.CommandText = "DECLARE @temp varchar(500);" & _
"DECLARE @data_filename varchar(500);" & _
"DECLARE @log_filename varchar(500);" & _
"IF NOT EXISTS (SELECT * FROM master..sysdatabases WHERE name = 'jahiziyeh_" + code_shakheh + "') " & _
"BEGIN " & _
"CREATE DATABASE jahiziyeh_" + code_shakheh + ";" & _
"SELECT @temp=filename FROM master..sysdatabases WHERE name = 'jahiziyeh_" + code_shakheh + "'; " & _
"set @data_filename=left(@temp,len(@temp)-4)+'_data.mdf'; " & _
"set @log_filename=left(@temp,len(@temp)-4)+'_log.mdf';" & _
"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET SINGLE_USER with ROLLBACK IMMEDIATE;" & _
"RESTORE DATABASE jahiziyeh_" + code_shakheh + " FROM DISK='" + Application.StartupPath + "\database\jahiziyeh_empty.bak' WITH REPLACE," & _
"MOVE 'jahiziyeh_data' TO @data_filename," & _
"MOVE 'jahiziyeh_Log' TO @log_filename;" & _
"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET MULTI_USER;" & _
"END " '& _
'"ELSE " & _
'"BEGIN " & _
'"SELECT @temp=filename FROM master..sysdatabases WHERE name = 'jahiziyeh_" + code_shakheh + "'; " & _
'"set @data_filename=left(@temp,len(@temp)-4)+'_data.mdf';" & _
'"set @log_filename=left(@temp,len(@temp)-4)+'_log.mdf';" & _
'"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET SINGLE_USER with ROLLBACK IMMEDIATE;" & _
'"RESTORE DATABASE jahiziyeh_" + code_shakheh + " FROM DISK='" + Application.StartupPath + "\database\jahiziyeh_empty.bak' WITH REPLACE," & _
'"MOVE 'jahiziyeh_data' TO @data_filename," & _
'"MOVE 'jahiziyeh_Log' TO @log_filename;" & _
'"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET MULTI_USER;" & _
'"END"
Try
cmd.Connection.Open()
cmd.ExecuteNonQuery()

'=========یافتن نام شاخه
Dim array_colum_output As New ArrayList
Dim array_colum_search As New ArrayList
Dim array_operator As New ArrayList
Dim array_value_search As New ArrayList
Dim array_and_or As New ArrayList
Dim datatable_temp As New DataTable

array_colum_output.Clear()
array_colum_search.Clear()
array_operator.Clear()
array_value_search.Clear()
array_and_or.Clear()

array_colum_search.Add("code_shakheh")
array_value_search.Add(code_shakheh)
array_operator.Add("=")
array_and_or.Add("and")

Module1.search_select(array_colum_output, array_colum_search, array_operator, array_value_search, array_and_or, "Shakheh", Fill_types.SchimaData, datatable_temp)
If datatable_temp.Rows.Count <> 0 Then
Me.ToolStripStatusLabel7.Text = datatable_temp.Rows(0)("name_shakheh")
End If
'=========

MsgBox("ساخت پایگاه داده و بازیابی اطلاعات پایه با موفقیت به پایان رسید", MsgBoxStyle.Information, "سیستم جهیزیه")

Catch ex As Exception
MsgBox("خطا در ایجاد و بازیابی اطلاعات پایه بانک اطلاعاتی ", MsgBoxStyle.Information, "سیستم جهیزیه")
MsgBox(ex.Message)
Exit Sub
Finally
cmd.Connection.Close()
End Try

Else
'====================پاسخ منفی به ساخت پایگاه داده ================
Application.Exit()
'====================
End If
Else 'بانک اطلاعاتی وجود دارد حال باید جداول اطلاعاتی درون آن چک شود
cmd.Connection = New SqlClient.SqlConnection("server=.;database=master;integrated security=true;")
cmd.CommandText = "SELECT count(*) FROM jahiziyeh_" + code_shakheh + "..sysobjects WHERE name = 'Amozesh' AND type = 'U'"

Try
cmd.Connection.Open()
temp_cmd_ExecuteScalar = cmd.ExecuteScalar()
Catch ex As Exception
MsgBox("خطا در یافتن جداول بانک اطلاعاتی ", MsgBoxStyle.Information, "سیستم جهیزیه")
MsgBox(ex.Message)
Exit Sub
Finally
cmd.Connection.Close()
End Try

If temp_cmd_ExecuteScalar = 0 Then
If MsgBox(" بانک اطلاعاتی شاخه" + code_shakheh + " بدون اطلاعات پایه می باشد.آیا مایل به ساختن اطلاعات پایه هستید؟ ", MsgBoxStyle.YesNo, "سیستم جهیزیه") = MsgBoxResult.Yes Then
cmd.Connection = New SqlClient.SqlConnection("server=.;database=master;integrated security=true;")
cmd.CommandText = "DECLARE @temp varchar(500);" & _
"DECLARE @data_filename varchar(500);" & _
"DECLARE @log_filename varchar(500);" & _
"SELECT @temp=filename FROM master..sysdatabases WHERE name = 'jahiziyeh_" + code_shakheh + "'; " & _
"set @data_filename=left(@temp,len(@temp)-4)+'_data.mdf';" & _
"set @log_filename=left(@temp,len(@temp)-4)+'_log.mdf';" & _
"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET SINGLE_USER with ROLLBACK IMMEDIATE;" & _
"RESTORE DATABASE jahiziyeh_" + code_shakheh + " FROM DISK='" + Application.StartupPath + "\database\jahiziyeh_empty.bak' WITH REPLACE," & _
"MOVE 'jahiziyeh_data' TO @data_filename," & _
"MOVE 'jahiziyeh_Log' TO @log_filename;" & _
"ALTER DATABASE jahiziyeh_" + code_shakheh + " SET MULTI_USER;"

Try
cmd.Connection.Open()
cmd.ExecuteNonQuery()

'=========یافتن نام شاخه
Dim array_colum_output As New ArrayList
Dim array_colum_search As New ArrayList
Dim array_operator As New ArrayList
Dim array_value_search As New ArrayList
Dim array_and_or As New ArrayList
Dim datatable_temp As New DataTable

array_colum_output.Clear()
array_colum_search.Clear()
array_operator.Clear()
array_value_search.Clear()
array_and_or.Clear()

array_colum_search.Add("code_shakheh")
array_value_search.Add(code_shakheh)
array_operator.Add("=")
array_and_or.Add("and")

Module1.search_select(array_colum_output, array_colum_search, array_operator, array_value_search, array_and_or, "Shakheh", Fill_types.SchimaData, datatable_temp)
If datatable_temp.Rows.Count <> 0 Then
Me.ToolStripStatusLabel7.Text = datatable_temp.Rows(0)("name_shakheh")
End If
'=========

MsgBox("اطلاعات پایه با موفقیت بازیابی شد", MsgBoxStyle.Information, "سیستم جهیزیه")


Catch ex As Exception
MsgBox("خطا در بازیابی اطلاعات پایه ", MsgBoxStyle.Information, "سیستم جهیزیه")
MsgBox(ex.Message)
Exit Sub
Finally
cmd.Connection.Close()
End Try

Else
'==================== پاسخ منفی به بازیابی اطلاعات پایه ================
Application.Exit()
'====================
End If
End If
End If

'===============================
'===============================
End Sub


موفق باشی

jaza_sa
یک شنبه 14 بهمن 1386, 00:04 صبح
سلام
چرا به جای جواب به سوال، صورت سوال رو پاک میکنید

اگه از SQL Server 2005 استفاده میکنید میتونید از این Script استفاده کنید



USE [master]
GO
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'EnglishAcademy')
EXEC sp_attach_db
@dbname = N'EnglishAcademy',
@filename1 = N'C:\Program Files\English Academy\Data\DB.mdf',
@filename2 = N'C:\Program Files\English Academy\Data\DB_log.ldf' ;

البته باید بگم که هنوز خودم امتحانش نکردم، ولی به احتمال زیاد کار کنه!!!
درضمن اگر میشه بجای اینکه جواب ی سوال دیگرو بدید، جواب سوال پرسیده شده رو بگید.
متشکرم

boof1363
دوشنبه 15 بهمن 1386, 15:51 عصر
مرسی از راحنمایتون
میشه بگید این کد رو کجا باید نوشت؟

rezano
چهارشنبه 22 دی 1389, 13:02 عصر
سلام

ببخشید برنامه ای که دیتابیس Sql داره اگه دیتابیسش mdf باشه روی سیستمی که Sql نصب نباشه اجرا میشه؟
یا کلا باید هر وقت از Sql استفاده می کنیم باید روی سیستم مصرف کننده حتما Sql server نصب باشه؟

حمیدرضاصادقیان
چهارشنبه 22 دی 1389, 22:14 عصر
سلام.
دوست عزیز سعی کنید سوالتون رو در یک تاپیک جداگانه بپرسید.


ببخشید برنامه ای که دیتابیس Sql داره اگه دیتابیسش mdf باشه روی سیستمی که Sql نصب نباشه اجرا میشه؟
یا کلا باید هر وقت از Sql استفاده می کنیم باید روی سیستم مصرف کننده حتما Sql server نصب باشه؟

در مورد سوالتون باید بگم خیر اجرا نخواهد شد.
چون این فایل رو شما باید ابتدا به Engine SQL Server اول attach کنید تا بتونید از اون استفاده کنید.