PDA

View Full Version : حرفه ای: انتقال اطلاعات دیتابیس قدیمی به دیتابیس ورژن جدید برنامه



TeacherMath
شنبه 06 تیر 1394, 10:49 صبح
با سلام. یه برنامه برای یک رستوران نوشتم حالا می خوام اونو ارتقاع بدم اما فک کنم دیتابیس تغییر کنه . سوالم اینه که شما با چه روشی اطلاعات رو به دیتابیس جدید انتقال می دهید. خودم این روش ها به ذهنم می رسه:

1. بیام دیتابیس رو از اونا بگیرم و خودم دیتابیس رو پر کنم.
اشکال این روش اینه که اگه مثلا برنامه رو به یه نفر بفروشی و بخواد نسخه جدید رو خودش نصب کنه مشکل پیش می آد.
2. بیام توی نسخه جدید یه قسمت اضافه کنم که به دیتابیس قدیمی وصل بشه و اطلاعات اونو به صورت خودکار به دیتابیس جدید اضافه کنه.

از 2008 sqlserver express به صورت user instance استفاده کردم یعنی دیتابیس توی یه فولدره بهش وصل میشم.

alireza264
شنبه 06 تیر 1394, 11:17 صبح
سلام
منظورت از ارتقا چه؟
تغییر ساختار جدول یا استفاده از نگارش های جدیدتر sqlserve

TeacherMath
شنبه 06 تیر 1394, 11:28 صبح
تغییر ساختار جدول ها

alireza264
شنبه 06 تیر 1394, 11:38 صبح
از Alter tabel استفاده کن
برای اضافه ، حدف ویا تغییر نوع فیلد از Alter table

try
{
SqlCommand _CmdUpdateTable32 = new SqlCommand(@"Alter Table Tbl_StopDriver ADD Oil int ", _Conn);
_CmdUpdateTable32.ExecuteNonQuery();
}
catch (Exception)
{
// MessageBox.Show("6", "اخطار", MessageBoxButton.OK, MessageBoxImage.Warning);
}

برای ایجاد جدول جدید

try
{
SqlCommand _CmdUpdateTable33 = new SqlCommand(@"Create Table Tbl_NewFish ( No_Fish int , Cod_Personel1 bigint , Cod_BUS int , Cod_Line float ,
DateStart date , DateEnd date, PRIMARY KEY ( No_Fish) ) ", _Conn);
_CmdUpdateTable33.ExecuteNonQuery();
}
catch ()
{

}

Javad_raouf
شنبه 06 تیر 1394, 11:43 صبح
2. بیام توی نسخه جدید یه قسمت اضافه کنم که به دیتابیس قدیمی وصل بشه و اطلاعات اونو به صورت خودکار به دیتابیس جدید اضافه کنه.

به نظر من روش درست این دومیه است البته با اون روشی که الان توضیح می دم
من خودم از این روش استفاده می کنم و با اینکه تا حالا بیشتر از 100 بار دیتابیسم تغییر کرده و نزدیک هزار تا مشتری داریم هیچ وقت خدا رو شکر مشکل نخوردم
روش من به این صورته:
یک فایل متنی دارم به نام Update.SQL که توش کوئری های SQL جهت آپدیت دیتابیس به آخرین ورژن قرار داره
ساختار این فایل اینجوریه:

------------------------------------------------------------------------------------------------------------
----Database Ver (1.00)
------------------------------------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Products_Categories]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[Products] DROP CONSTRAINT FK_Products_Categories
GO


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Categories]
GO


CREATE TABLE [dbo].[Categories] (
[CategoryID] [int] IDENTITY (1, 1) NOT NULL ,
[CategoryName] [nvarchar] (15) COLLATE Arabic_CI_AS NOT NULL ,
[Description] [ntext] COLLATE Arabic_CI_AS NULL ,
[Picture] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
--------------------------------------
Update tblsetting set setting='1.01' Where nam='VerDB'
GO
------------------------------------------------------------------------------------------------------------
----Database Ver (1.01)
------------------------------------------------------------------------------------------------------------
ALTER TABLE dbo.Categories ADD
Test int NULL
GO
--------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CustomerCustomerDemo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[CustomerCustomerDemo]
GO


CREATE TABLE [dbo].[CustomerCustomerDemo] (
[CustomerID] [nchar] (5) COLLATE Arabic_CI_AS NOT NULL ,
[CustomerTypeID] [nchar] (10) COLLATE Arabic_CI_AS NOT NULL
) ON [PRIMARY]
GO
--------------------------------------
Update tblsetting set setting='1.02' Where nam='VerDB'
GO
------------------------------------------------------------------------------------------------------------
----Database Ver (1.02)
------------------------------------------------------------------------------------------------------------
الی آخر

تفسیر این فایل یکم برام سخته
یک جدول توی دیتابیس داریم به نام tblsetting که یک رکورد داره که نامش VerDB است و مقدارش نسبت به نسخه دیتابیش متغیره مثلا در ابتدا مقدارش 1.00 هست
و هر وقت دیتابیس آپیدت بشه این تغییر می کنه و این مقدار مشخص می کنه که دیتابیس تا چه ورژنی آپدیت شده
و ما هر تغییری توی دیتابیس اصلیمون می دیم کوئریش رو توی این فایل کپی می کنیم و در آخر با نوشتن این کد:

Update tblsetting set setting='1.01' Where nam='VerDB'
GO
ورژن دیتابیس رو تغییر می دیم تا بعدا بفهمیم این دیتابیس چقدر آپدیت شده
---------------------------
نمی دونم تونستم مطلب رو برسونم یا نه....
ببین من فایل Update.SQL خودم الان 3 مگابایت حجمشه یعنی از قدیمی ترین تغییرات دیتابیسم تا آخرین تغییراتی که دادم توش هست
بعد وقتی می خوام برنامه مشتری رو با نسخه جدید آپدیت می کنم علاوه بر جایگزینی فایل های نرم افزار فایل Update.SQL جدید رو هم جایگزین می کنم
حالا برنامه خودکار از روی فایل Update.SQL دیتابیس رو اپدیت می کنه به این صورت:
توی تابع آپدیت دیتابیس:
اول از توی جدول tblsetting بررسی می کنم ببینم ورژن جاری دیتابیس چیه مثلا ورژن جاری دیتابیس 1.01 هست
بعد توی فایل Update.SQL این عبارت رو سرچ می کنم :

----Database Ver (1.01)
وقتی این عبارت رو پیدا کردیم کوئری های بعد از این عبارت رو اجرا می کنیم
هم دیتابیس با آخرین تغییرات به روز میشه هم وقتی به این کد می رسیم:

Update tblsetting set setting='1.02' Where nam='VerDB'
GO
نسخه دیتابیس به 1.02 تغییر پیدا می کنه که در آپدیت های بعدی کوئری های قبل از:

----Database Ver (1.02)

اجرا نشه
هر جاش رو متوجه نشدی بگو توضیح بدم
=============================================
فقط نکته مهم اینه که کوچکترین تغییرات در دیتابیست رو باید توی فایل Update.SQL کوئریش رو بنویسی تا بعدا مشکل نخوری
حالا شاید یک سوال برات پیش بیاد که وقتی تغییرات رو با Designer انجام می دیم و کد نمی زنیم چطوری کدش رو توی Update.SQL وارد کنیم؟؟؟؟؟
اینم خیلی سادست
اگر با SQL 2008 کار می کنی بعد از اینکه در محیط SQL Server Management Studio جدول را تغییر دادی قبل از اینکه تغییرات رو Save کنی از منوی Table Designer گزینه Generate Change Script رو بزن یک کوئری بهت نشون میده که همون کارایی که شما توی دیزاینر کردی رو با اون کوئری می تونی انجام بدی حالا این کوئری رو توی فایل Update.SQL کپی کن
ان شا الله که متوجه شده باشید دستام کف کرد اینقدر حرف زدم:لبخند:

TeacherMath
شنبه 06 تیر 1394, 16:36 عصر
درسته. ولی من از sqlexpress استفاده می کنم یعنی دیتابیس رو توی یه پوشه می ریزم و بهش وصل میشم. حالا وقتی ورژن جدید نصب میشه دیتابیس جدید توی یه پوشه دیگه ریخته میشه یعنی نمی خوام ساختار دیتابیس قدیمی رو عوض کنم فقط می خوام داده های دیتابیس قدیمی رو وارد دیتابیس جدید کنم. الان فقط نمی تونم توی استور پروسیجر در دیتابیس جدید به دیتابیس قدیمی وصل بشم.

alireza264
شنبه 06 تیر 1394, 16:48 عصر
سلام
با روش های بالا نیاز به دیتابیس جدید نیست تغییرات توی همون دیتابیس رخ میده
اما فکر کنم مشکل شما اینه نگارش sqlexpress دیتابیس قبلی با جدیده فرق میکنه و طبیعییه که دیتابیس قبلی خونده نشه. باید هردو نسخه express با نام متفاوت نصب بشه و در conectionstring ها نام برده بشه

TeacherMath
شنبه 06 تیر 1394, 17:03 عصر
منظورم اینه که مثلا توی دیتابیس جدید یه استورپروسیجر داشته باشم که درون آن بشه به دیتابیس قدیم وصل شد توی استور پروسیجر کانکشن استرینگ میشه استفاده کرد؟ مثلا به صورت زیر اما اینطوری جواب نمیده
use [‪D:\Test\DataBaseTest.mdf]go
select * from [dbo].Testtable

alireza264
شنبه 06 تیر 1394, 17:16 عصر
درسته جواب نمیده چون دسترسی به دتا بیس دیگه وقتی انجام میشه که هردو در sqlserver باشنذ که باعث میشه قابل دسترسی باشند
در مدل درخواستی شما دیتا بیس قدیمی باز نمیشه و connection string رو نمیشه در استور پروسجر براش تعریف کرد

TeacherMath
شنبه 06 تیر 1394, 20:05 عصر
با این روش حلش کردم که فایل های دیتابیس قدیمی را توی پوشه نسخه جدید ریختم و تغییرات رو توی کد سی شارپ روی دیتابیس قدیمی اعمال کردم.