الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ازاي اعمل اتتاتش للداتا بيس في سكوال اكسبرس من خلال Vb.net

بدأه walycs في 15 فبراير 2009 · 8 رد · 1,480 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

Hi Experts,

I developed an app using VB.net and SQLExpress. Now, I need to deploy my application. I have a few questions:

1) When the application is first installed on a server, how do I make SQLExpress attach the database

2) On client machine, I need to modify the connection strings in the config to point to the server. How do I determine the server's name?

3) Should I create two installer?? One for server and one for client machine?

4) If after installing the app on the server, how do I make changes to the db (ie add/delete table, columns etc..)??Start Free Trial

#2

أولا - لقد قمت بحل هذه المشكلة في برنامجي بجعله ينفذ أمر Create Database و Create Table في بداية تشغيل برنامجي عند عدم تمكنه من إيجاد قاعدة البيانات على السيرفر

ثانيا - بالنسبة للسيكول إكسبريسس يكون الاسم الافتراضي للمخدم على جميع الأجهزة عند تنصيبه sqlexpress وفي أغلب الحالات يتم تنصيبه بالاسم الافتراضي

ثالثا - هناك العديد من المواضيع التعليمية التي ستفيدك في قسم ADO .net المخصص لقواعد البيانات من خلال الدوت نيت بمحتلف أنواعها وبغض النظر عن لغة البرمجة

رابعا - يرجى الكتابة باللغة العربية فهذا منتدى عربي وموجه للجمهور العربي

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 15 فبراير 2009 في 13:58

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

اولا: اسف جدا عن استخدام الانجليزية فانا اصلا لا اتحداثها الا اضطرارا ومع ذلك احب العربية كثيرا جدا

ولكن هذا السؤال وجدته في مندى اجنبي فنسخته كما هو لانه يعبر عما اريد

ثانيا:زي السؤال ما هو مكتوب انا عندي برنامج بال في بي دوت نت عايز لما اسلمه للعميل بمجرد انه يسطبه يشتغل طبعا عملت الببلش بس البرنامج يحتوي على تقارير كريستال ريبوتازاي اضمن ملفات الكريستال ريبورت في التسطيب والمشكلة الكبرى ازاي اعمل اتتاتش للداتا بيس في السيكوال سرفر اكسبرس

ارجو التوضيح بالكود مع الشرح اذا امكن

وجزاكم الله خيرا

#4

بالنسبة لموضوع تضمين الكريستال هناك زر مكتوب عليه prerequesties في خصائص My Computer في صفحة publish إذا كنت تشتغل على click once أو بتلاقي زر مماثل في خصائص نشر المشروع بتقنية setup wizard ولتفاصيل قم بالبحث في المنتدى عن مواضيعي بهذا الخصوص

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#5

بالنسبة لانشاء قاعدة البيانات أنا عم بعملها برمجيا

Dim Cmnd As New SqlCommand("CREATE DATABASE [DisksArchive]", New SqlConnection( _
									   "Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True;"))
			Cmnd.Connection.Open()
			Cmnd.ExecuteNonQuery()

			Cmnd.CommandText = "ALTER DATABASE [DisksArchive] SET COMPATIBILITY_LEVEL=80"
			Cmnd.ExecuteNonQuery()

			Cmnd.Connection.Close()
			Cmnd.Dispose()

وإنشاء الجداول أيضا برمجيا

			Using Con As New SqlConnection(My.Settings.DisksArchiveConnectionString)
				Using sCmd As New SqlCommand
					With sCmd
						.CommandType = CommandType.Text
						.Connection = Con
						.Connection.Open()
						.CommandText = "IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_DISKS_CONTENTS_KIND]') AND parent_object_id = OBJECT_ID(N'[dbo].[DISKS]')) "
						.CommandText &= "ALTER TABLE [dbo].[DISKS] DROP CONSTRAINT [FK_DISKS_CONTENTS_KIND]"
						.ExecuteNonQuery()
						.CommandText = "IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CONTENTS_KIND]') AND type in (N'U')) DROP TABLE [dbo].[CONTENTS_KIND]"
						.ExecuteNonQuery()
						.CommandText = "CREATE TABLE [dbo].[CONTENTS_KIND]("
						.CommandText &= "[CKID] [int] IDENTITY(1,1) NOT NULL, "
						.CommandText &= "[CONTENTS_KIND] [nvarchar](25) NOT NULL, "
						.CommandText &= "CONSTRAINT [PK_CONTENTS_KIND] PRIMARY KEY CLUSTERED "
						.CommandText &= "(	[CKID] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY], "
						.CommandText &= "CONSTRAINT [IX_CONTENTS_KIND] UNIQUE NONCLUSTERED ( [CKID] ASC) "
						.CommandText &= "WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]"
						.ExecuteNonQuery()
					End With
				End Using
			End Using

وذلك ضمن إجراء أستدعيه عند فشل ملئ الـ DataSet بالبيانات

		Try
			Me.DisksArchiveDataSet.Clear()

			OpenTableAdapterConnections()

			Me.ContentS_KINDTableAdapter1.Fill(Me.DisksArchiveDataSet.CONTENTS_KIND)
			Me.SubjectTableAdapter1.Fill(Me.DisksArchiveDataSet.SUBJECT)
			Me.DiskkindTableAdapter1.Fill(Me.DisksArchiveDataSet.DISKKIND)
			Me.DISKSTableAdapter.Fill(Me.DisksArchiveDataSet.DISKS)
		Catch ex As SqlException
			'MsgBox(ex.Number.ToString & " - Samer")
			If TriedAgain = False Then
				RefillDatasets(True)
			Else
				If ex.Number = 15350 Or ex.Number = 4060 Then
					CreateDatabase()
					RefillDatasets()
				Else
					System.Media.SystemSounds.Asterisk.Play()
					MsgBox(ex.Message & ControlChars.CrLf & ControlChars.CrLf & "RFDS")
				End If
			End If
		End Try
	End Sub

وهكذا حتى لو تم حذف قاعدة البيانات من المخدم في أي وقت يمكنن للبرنامج إعادة إنشاؤها والمتابعة

وأعتذر بشدة عن وضع كود المشروع كاملا وأعتقد أن هذه معلومات كافية للمتابعة

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

يبدو انك لم تفهمني

المشكلة عندي هي كيفية تضمين الداتا بيس خلال السيكوال بواسطة الكود (دوت نت)

ببساطة انا عندي برنامج في بي دوت نت وداتا بيس سيكوال 2000 ازاي لما انقل البرنامج للعميل يشتغل البرنامج بدون ما اعمل ما اتاتش للداتا بيس يدويا

#7

على فكرة ياجماعة انا تعبت كتير من البحث في هذا الموضوع ومش عارف اوصل لحل

ياريت اللي عنده حل ما يخل علي به

#8

ان شاء الله حد هيرد علي

#9

يا عزيزي

أقول لك من خلال خبرتي البسيطه انه يجب نسخ قاعده البيانات ومن ثم تنصيب SQLExpress في جهاز الزبون

ومن ثم عمل تاتش يدوي ويكون كود الإتصال هو

dim constring As String = "Data Source=" + My.Computer.Name & "\SQLEXPRESS" + ";Initial Catalog=My_Data;Integrated Security=SSPI;persist security info=False;"

او تاتش كود وتكون الداتا بيز ضمن البرنامج وربطها عبر الكود .. فتستخدم الإجراء هذا لجلب قاعدة البيانات

	Public Function GETATTACHDATABASENAME() As Boolean
		On Error Resume Next
		Dim DS As New DataSet
		Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLEXPRESS" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
		Dim str As String = "Select DISTINCT name from master.dbo.sysdatabases where name Like 'My_Data' and has_dbaccess(Name) = 1 "
		Dim ADP As SqlClient.SqlDataAdapter
		ADP = New SqlClient.SqlDataAdapter(str, SqlConnection1)
		DS.Clear()
		ADP.Fill(DS)
		Dim i As Integer
		If DS.Tables(0).Rows.Count = 0 Then
			GETATTACHDATABASENAME = False
			MessageBox.Show(" قاعدة البيانات  'My_Data'" & "غير متصلة بالسرفر جارى عمل الاتصال" & vbCrLf & vbCrLf & " من فضلك انتظر قليلاَ							 ", My.Computer.Name, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading)
		Else
			GETATTACHDATABASENAME = True
		End If
		ADP.Dispose()
		SqlConnection1.Dispose()
	End Function

وبعد ذلك ياتي اجراء التاتش ... وكذلك فشل عمل التاتش

	Public Sub ATTACHDATABASENAME(ByVal MYDBNAME As String, ByVal f1lepathprimary As String, ByVal f1lepathlog As String)
		Try
			Dim SqlConnection1 As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=" + My.Computer.Name & "\SQLEXPRESS" + ";Initial Catalog=tempdb;Integrated Security=SSPI;")
			Dim CMD As SqlClient.SqlCommand = New SqlClient.SqlCommand
			CMD.CommandType = CommandType.Text
			CMD.Connection = SqlConnection1
			If SqlConnection1.State = ConnectionState.Open Then SqlConnection1.Close()
			SqlConnection1.Open()
			CMD.CommandText = "sp_attach_db " & MYDBNAME & ",'" & f1lepathprimary & "'" & ",'" & f1lepathlog & "'"
			' OR CMD.CommandText = "CREATE DATABASE " & MYDBNAME & " ON (FILENAME = '" & f1lepath & "')FOR ATTACH"
			CMD.ExecuteNonQuery()
			SqlConnection1.Dispose()
			MessageBox.Show("تم انشاء اتصال  قاعدة البيانات 'My_Data' بالسرفر ", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
		Catch ex As Exception
			Dim result As Integer
			result = MessageBox.Show("فشل البرنامج فى انشاء اتصال  قاعدة البيانات 'My_Data' بالسرفر", "ATTCH DATABASE", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2, MessageBoxOptions.RtlReading)
		End Try
	End Sub

هذا والله اعلم لكنني مجرب لهذه الطريقه واستفدت منها كثيرا اتمنى ان تكون قد استفدت منها

تم تعديل هذه المشاركة بواسطة yemen_design في 23 فبراير 2009 في 18:30

4466417408_cea9b04c38_o.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…