PDA

View Full Version : گرفتن بکاپ از دیتا بیس (فقط داده ها نه ساختار)



mina.net
یک شنبه 10 آبان 1388, 14:56 عصر
سلام دوستان
من از کدی که برای بکاپ کیری از دیتابیسم استفاده می کنم موقعی که ریستور می شه ساختار دیتابیس رو هم در صورت عوض شدن ساختار (کم و زیاد شدن فیلد ها یا نوع و هر تغییر ساختاری)تغییر می ده .
از انجای کاربران از دیتابیس قدیمی تر استفاده می کنند و با آپدیت برنامه ممکن هست تو ساختار دیتابیس هم تغییراتی ایجاد بشه. می خوام به نحوی بکاپ تهیه شود که بعدا در صورت ریستور کردن دیتابیس رو به حالت قبلی برنگرداند.
چطور می تونم این کار رو بکنم؟
این هم کدی که برای بکاپ گیری استفاده می کنم.

البته من این سوال رو تو تالار vb.net هم مطرح کردم و از آنجای که به نتیجه نرسیدم گفتم از برنامه نویس های C#‎ کمک بگیرم(مدیرای تالار لطفا این تاپیک رو حذف نکنید)



'پشتیبان گیری از بانک
Dim shams AsString = shamsi()
shams = shams.Replace("/", "-")
Dim str_name_backup AsString = shams & "__Tala.bak"
Dim DevicePath AsString
With SaveFileDialog1
.FileName = str_name_backup
.DefaultExt = "bak"
.Filter = "DateBase Backup File(*.bak)|*.bak"
.OverwritePrompt = True
EndWith
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
DevicePath = SaveFileDialog1.FileName
IfMy.Computer.FileSystem.FileExists(DevicePath) Then Kill(DevicePath)
con.Close()
con.Open()
Dim Srvcon AsNew ServerConnection(con)
Dim Srv AsNew Server(Srvcon)
' Create backup device item for the backup
Dim bdi AsNew BackupDeviceItem(DevicePath, DeviceType.File)
' Create the backup informaton
Dim Backup AsNew Backup
Backup.Devices.Add(bdi)
With Backup
'Type Of Backup
.Action = BackupActionType.Database
.BackupSetDescription = "Backup DataBase"
.BackupSetName = "DB"
.Database = con.Database.ToString()
.LogTruncation = BackupTruncateLogType.Truncate
'Backup.ExpirationDate = New DateTime(2007, 5, 1)
' Run the backup
.SqlBackup(Srv)
EndWith
MessageBoxFa.Show("عملیات تهیه فایل پشتیبان به موفقیت انجام شد ", _
name_me, MessageBoxButtons.OK)
Else
MessageBoxFa.Show(" انجام نشد ", name_me, MessageBoxButtons.OK)
EndIf

البته کد با vb هست . شما با هر زبانی توضیح بدی ممنون می شم

saied_genius
یک شنبه 10 آبان 1388, 15:55 عصر
خوب به نظر من اگر شما هدفتان اين است که ساختار پس از restore نسبت به ديتابيس اوليه هيچ تغييري نکند و اطلاعات آن هم برايتان مهم نيست، از ساختار ديتابيس يک اسکريپت تهيه کنيد و آنرا restore کنيد.

البته اگر درست متوجه سوالتان شده باشم!

موفق باشيد.

saied_genius
یک شنبه 10 آبان 1388, 16:03 عصر
اووووووه
ببخشيد ، مثل اينکه من سوال را کاملاً برعکس متوجه شدم.

يه برنامه هست به نام sqlpubwiz ، اين برنامه مال خود مايکروسافت است و امکان backup گيري هم از اطلاعات (به تنهايي) هم از ساختار (به تنهايي) و هم از اطلاعات و ساختار (با هم ديگه) را دارد.

امکان استفاده با command prompt را هم دارد. يعني مي توانيد از داخل برنامه به صورت process با پرامتر صداش کنيد.


sqlpubwiz سرچ کني راحت پيدا مي شه.

خود مايکروسافت هم براي دانلود گذاشته.

لينک دانلودش را يادم نيست.

من الان 3 ساله دارم باهاش کار مي کنم ، هيچ مشکلي هم باهاش ندارم.

راهنماي استفاده :

sqlpubwiz.exe/?

سوالي بود در خدمتم.

موفق باشيد.

mina.net
یک شنبه 10 آبان 1388, 16:48 عصر
سلام دوست عزیز
ممنون از توجهی که دارید. من نتونستم لینک دانلودش رو پیدا کنم. اگه می شه لینک بدید. و بفرمایید هجمش چقدر هست (چون من dialupم)

saied_genius
یک شنبه 10 آبان 1388, 16:59 عصر
ok

اين هم برنامه ، خودم براتون گذاشتم ، بيخودي نگرديد دنبالش.

به قسمت هاي 400kb تقسيم کردم.

حجم کل 1.42MB است.

موفق باشيد.

saied_genius
یک شنبه 10 آبان 1388, 17:03 عصر
اين هم لينک دانلود sqlpubwiz از مايکروسافت:(براي دوستاني که مي خواهند مستقيم دانلود کنند)

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

حجم فايل: 2.1MB
نوع فايل: msi.
زمان دانلود با اينترنت 6min : dialup

موفق باشيد.

mina.net
یک شنبه 10 آبان 1388, 17:09 عصر
من الان در حال دالود کردن فایلها هستم . امیدوارم در استفاده از این برنامه هم راهنمایی نمایید. بازم ممنون

saied_genius
یک شنبه 10 آبان 1388, 17:13 عصر
?/sqlpubwiz
براي استفاده با command prompt

در حالت ويژوال هم خيلي گويا است.

موفق باشيد.

mina.net
یک شنبه 10 آبان 1388, 17:46 عصر
سلام دوست عزیز
من دانلود کردم بنظر برنامه بسیار جالبی می یاد .

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

توجه نمایید منظورم دو حالت مختلف هست.
در ضمن آیا می شه از امکانات این برنامه تو کد نویسی خدمون استفاده کنیم و کارها روتین شود یعنی نیاز به حضور ما در محل نباشد. کار بر نرم افزار من بتونه خودش این کار ها رو انجام بده یعنی با ارسال برنامه جدید برای وی خودش بتونه برنامه جدید رو نصب کنه و ریستور لازم رو انجام بده بدون اینکه به اطلاعات دیتابیسش خدشه ای وارد بشه؟

saied_genius
یک شنبه 10 آبان 1388, 18:10 عصر
ببينيد ....

فکر کنم شما داريد کلاً راه را اشتباه مي رويد.

اگر کامل توضيح دهيد چي کار مي خواهيد انجام دهيد بهتر است.

اما طبق برداشت من ، کاربر شما يک سري اطلاعات داخل ديتابيس دارد که ممکن است روز به روز بيشتر شود.

حالا شما هم جداگانه مي خواهيد يکسري اطلاعات جديد به آن اضافه کنيد.

اين کار با restore کردن ديتابيس کار درستي نيست.

بهتره شما از اطلاعات ديتابيستان يک script از نوع insert بسازيد و اطلاعات جديد رو insert نماييد.

اگر اشتباه مي کنم لطفاً من رو توي اين مسئله روشن کنيد تا بهتر بتوانم شما را راهنمايي کنم.

موفق باشيد.

mina.net
یک شنبه 10 آبان 1388, 18:35 عصر
اگر اشتباه مي کنم لطفاً من رو توي اين مسئله روشن کنيد تا بهتر بتوانم شما را راهنمايي کنم.
.
دوست عزیز شما برعکس متوجه شدید.
فرض کنید من یک برنامه حسابداری به یکی فروختم بعد از مدتی اطلاعاتی در اون ثبت می شه که گاها ارزش اون اطلاعات 10 ها برابر بنامه من خواهد بود البته از نظر کاربر

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

بعد از مدتی برنامه توسط من (شرکت تولید کننده نرم افزار مورد نظر) ویرایش می شه و امکانات جدیدی به اون اضافه می شه. طی این ویرایش ممکنه ساختار دیتابس هم تغییر کند.

خوب حال اگه ما بریم و برنامه جدید رو برای کاربرمون نصب کنیم. باید اطلاعات قدیمی رو برای وی بازیابی کنیم. در اینصورت چه اتفاقی می فته : با ریستور کردن اطلاعات قدیمی کاربر دوباره دیتابیس قدیمی(هم داده ها و هم ساختار) جایگزین دیتابیس جدیدی خواهد شد که این خواست ما نیست ما می خواهیم فقط داده ها ریستور بشن نه ساختار که برای تحقق این خواست باید یکی از دو حالت زیر رو عملی کرد
1 - از دادههای دیتابیس بکاپ تهیه کنم بدون ساختار
2- چطور می تونم دیتابیس جدید رو با استفاده از این برنامه جایگزین دیتابیس قبلی کنم. بدون اینکه به داده های آن آسیبی وارد شود.
که البته من نمی دونم چطور باید یکی از این دو راه حل رو عملی کرد.اگه شما می تونید کمک کنید

نمی دونم درست توضیح دادم یا خیر

saied_genius
یک شنبه 10 آبان 1388, 18:52 عصر
خوب حالا مسئله روشن شد.

ببينيد، من که گفتم داريد راه را اشتباه مي رويد.

شما وقتي برنامه را مي خواهيد آپديت کنيد از تغييرات ايجاد شده در ديتابيس script تهيه کنيد و فقط آنرا روي سيستم کاربر اجرا کنيد.

اينجوري نه ديتابيس طرف مشکل پيدا مي کنه و نه نياز به restore و backup هاي اضافي هست.

اصل exe را هم که تغيير دهيد هيچگونه مشکلي پيدا نمي کنيد.

(طبق تجربه چندين ساله)

نياز به راهنمايي بيشتر داريد در خدمتم.

موفق باشيد.

اَرژنگ
دوشنبه 11 آبان 1388, 04:35 صبح
دوست عزیز شما برعکس متوجه شدید.
فرض کنید من یک برنامه حسابداری به یکی فروختم بعد از مدتی اطلاعاتی در اون ثبت می شه که گاها ارزش اون اطلاعات 10 ها برابر بنامه من خواهد بود البته از نظر کاربر

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

بعد از مدتی برنامه توسط من (شرکت تولید کننده نرم افزار مورد نظر) ویرایش می شه و امکانات جدیدی به اون اضافه می شه. طی این ویرایش ممکنه ساختار دیتابس هم تغییر کند.

خوب حال اگه ما بریم و برنامه جدید رو برای کاربرمون نصب کنیم. باید اطلاعات قدیمی رو برای وی بازیابی کنیم. در اینصورت چه اتفاقی می فته : با ریستور کردن اطلاعات قدیمی کاربر دوباره دیتابیس قدیمی(هم داده ها و هم ساختار) جایگزین دیتابیس جدیدی خواهد شد که این خواست ما نیست ما می خواهیم فقط داده ها ریستور بشن نه ساختار که برای تحقق این خواست باید یکی از دو حالت زیر رو عملی کرد
1 - از دادههای دیتابیس بکاپ تهیه کنم بدون ساختار
2- چطور می تونم دیتابیس جدید رو با استفاده از این برنامه جایگزین دیتابیس قبلی کنم. بدون اینکه به داده های آن آسیبی وارد شود.
که البته من نمی دونم چطور باید یکی از این دو راه حل رو عملی کرد.اگه شما می تونید کمک کنید

نمی دونم درست توضیح دادم یا خیر
باید از ورژن سازی داتابیس استفاده کنید،
یا هم اینکه قبل از نصب برنامه تمام داده‌ها را از داتابیس قدیمی به داتابیس جدید کوچ بدید، باید یک نقشه که کدام فیلد و جدول در کدام داتابیس قدیمی به کدام فیلد و جدول در داتابیس جدید کوچ داده بشه داشته باشید.
این گونه مشکلات فقط به شکلی قابل حل هستند که بعد از ساختن داتابیس جدید برایه کوچ دادن داتا از قبل برنامه ریزی و تست انجام داده باشید.
مشکل اصلی آصیب وارد نشدن به داده‌ها نیست، اینکه چه داده‌ای به چه مفهمومی در داتابیس جدید باید تفکیک بشد است.

mina.net
دوشنبه 11 آبان 1388, 14:41 عصر
شما وقتي برنامه را مي خواهيد آپديت کنيد از تغييرات ايجاد شده در ديتابيس script تهيه کنيد و فقط آنرا روي سيستم کاربر اجرا کنيد.

اگه امکانش هست برای من یک مثال بزنید. چون من قبلا این کار رو انجام ندادم.

mina.net
دوشنبه 11 آبان 1388, 14:58 عصر
باید از ورژن سازی داتابیس استفاده کنید،
یا هم اینکه قبل از نصب برنامه تمام داده‌ها را از داتابیس قدیمی به داتابیس جدید کوچ بدید، باید یک نقشه که کدام فیلد و جدول در کدام داتابیس قدیمی به کدام فیلد و جدول در داتابیس جدید کوچ داده بشه داشته باشید.
این گونه مشکلات فقط به شکلی قابل حل هستند که بعد از ساختن داتابیس جدید برایه کوچ دادن داتا از قبل برنامه ریزی و تست انجام داده باشید.
مشکل اصلی آصیب وارد نشدن به داده‌ها نیست، اینکه چه داده‌ای به چه مفهمومی در داتابیس جدید باید تفکیک بشد است.

این چیزی که شما می فرمایید به نظر زمان بر می یاد . یعنی خودش یک برنامه برنامه می شه. راستش رو بخواهید برنامه من زود به زود ویرایش می شه و می خوام خیلی زود کاربران هم از این ویرایش ها بهرهمند شوند ولی با این روشی که شما فرمودید کار خیلی سخت می شه. در ضمن من در70 درصد مواقع دیتابیس تغییر ساختاری پیدا نمی کنه. 95 درصد مواقع هم فقط فیلد ها یا جداولی به دیتابیس اضافه یا حذف می شود و خیلی کم پیش می یاد که یک فیلد از لحاظ نوع تغییر کنه. فکر نمی کنم این روشی که شما فرمودید موثر باشه.

saied_genius
دوشنبه 11 آبان 1388, 17:24 عصر
اگه امکانش هست برای من یک مثال بزنید. چون من قبلا این کار رو انجام ندادم.

ساختن table به نام table1 بر روي ديتابيسي به نام test

USE [test]
GO
/****** Object: Table [dbo].[table1] Script Date: 11/02/2009 17:35:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[field1] [nvarchar](50) NULL,
[field2] [nchar](10) NULL,
[field3] [int] NULL,
[field4] [image] NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
حالا يک script براي اضافه کردن field به table موجود:

USE [test]
GO
/****** Object: Table [dbo].[table1] Script Date: 11/02/2009 17:35:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Alter TABLE [dbo].[table1]
add [field5] [nvarchar](50) NULL,
[field6] [nchar](10) NULLحالا شما مثلاً مي خواهيد اين script رو روي سيستم کاربر اجرا نماييد، براي اين کار شما مي توانيد از sqlcmd.exe استفاده نماييد.

بهترين راه براي اين کار :

1- اسکريپت مورد نظر را به صورت يک فايل با پسوند sql. بسازيد.
2- از محيط برنامه خودتون يا يک برنامه ديگر به عنوان updater فايل script ساخته شده را به شکل زير اجرا نماييد:


System.Diagnostics.Process.Start("sqlcmd.exe", "-S نام سرور -i \"" + نام و مسير فايل مورد نظر جهت آپديت + "\"");مثال:


System.Diagnostics.Process.Start("sqlcmd.exe", "-S .\\sqlexpress -i \"c:\\test.sql\"");موفق باشيد.

اَرژنگ
دوشنبه 11 آبان 1388, 18:25 عصر
این چیزی که شما می فرمایید به نظر زمان بر می یاد . یعنی خودش یک برنامه برنامه می شه. راستش رو بخواهید برنامه من زود به زود ویرایش می شه و می خوام خیلی زود کاربران هم از این ویرایش ها بهرهمند شوند ولی با این روشی که شما فرمودید کار خیلی سخت می شه. در ضمن من در70 درصد مواقع دیتابیس تغییر ساختاری پیدا نمی کنه. 95 درصد مواقع هم فقط فیلد ها یا جداولی به دیتابیس اضافه یا حذف می شود و خیلی کم پیش می یاد که یک فیلد از لحاظ نوع تغییر کنه. فکر نمی کنم این روشی که شما فرمودید موثر باشه.

یک سوال:
اگر جایی در داتابیس فیلدی ، ساختاری تغییر کنه، بدانه حساب و کتاب چجوری میشه فهمید که چی عوض شده و بشه مطمعن بود که برنامه کاربر هنوز کار میکنه ؟
نمیدانم کنتراکتتان چطوریه ولی یادم یکجایی برایه داروخانه برنامه نوشته بودن هر روز که برنامه کار نمیکرد باید خسارت پرداخت میشد، حالا اگر همینطوری بدانه حساب و کتاب داتابیس کاربر را عوض کردن و همه چی به هم ریخت و کار نکرد ، این موضوع چقدر مهمه ؟ اگر که زیاد مهم نیست و میشه بدانه استرس و یواش درستش کرد ، بیخیال ولی اگر که باید خسارت پرداخت بشه و کار مشتری نخوابه ، چیزی که من گفتم نسبط به کاری که واقعا باید انجام بشه هیچ چی نیست، تازه باید قبل از اینکه ورژن جدید بزارید باید از مشتری یک کپی داتابیسش را بگیرید و امتحان کنید که کار کنه، تا زمانی که همه تستها را پس نکنه نمیشه برنامه جدید به مشتری داد.
من راه درست را برایه اینکه سخت است عوض نمیکنم، اگر راهی را به دلیل راحت بودن استفاده بشه کاره مشتری بخوابه و مشتری غرامت بخواهد چی؟ اونموقع کار سخت کردن درست بود یا اینکه شرکت را نخوابونند؟باید اول بدترین حالت ممکن را در نظر گرفت.

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


موفق باشید

mina.net
سه شنبه 12 آبان 1388, 14:51 عصر
سلام دوستان
جناب saied_genius (http://www.barnamenevis.org/forum/member.php?u=50269) ممنون از کمکی که می کنید . من نتونستم از توضیحاتی که فرمودید استفاده لازم رو ببرم. اگه امکانش هست همین مثال رو در قالب یک برنامه کوچیک برای من بزارید تا دانلود کنم . در ضمن من دیتابیس رو Attach می کنم اگه با توجه به این مثال بزنید ممنون می شم.
بازم شرمنده از زحمتی که به شما می دم.

saied_genius
سه شنبه 12 آبان 1388, 14:58 عصر
سلام

مثالي که من زدم ربطي به attach بودن يا نبودن database ندارد.

شما sqlserver را انتخاب مي کنيد و script را اجرا مي کنيد.

درون script هم نام ديتابيس را وارد مي کنيد.

مشکل شما در کجاست؟

کاري را که گفتم اصلاً تست کرديد؟

mina.net
سه شنبه 12 آبان 1388, 15:29 عصر
بله اجرا کردم
از کد شما به صورت زیر


System.Diagnostics.Process.Start("sqlcmd.exe", "-s .\\sqlexpress -i \" + "C:\Documents and Settings\barbod\Desktop\Tala_stup\1.sql")

استفاده کردم.ابتدا یک دیتابیس به نام test ایجاد کردم و سپس این کد رو اجرا کردم که هیچ جدولی به دیتابیس اضافه نشد.در ضمن نفهمیدم -s یا -i چه مفهومی دارد و برای چی هست.

saied_genius
سه شنبه 12 آبان 1388, 18:34 عصر
بله اجرا کردم
از کد شما به صورت زیر


System.Diagnostics.Process.Start("sqlcmd.exe", "-s .\\sqlexpress -i \" + "C:\Documents and Settings\barbod\Desktop\Tala_stup\1.sql")
استفاده کردم.ابتدا یک دیتابیس به نام test ایجاد کردم و سپس این کد رو اجرا کردم که هیچ جدولی به دیتابیس اضافه نشد.در ضمن نفهمیدم -s یا -i چه مفهومی دارد و برای چی هست.

به اين صورت تغييرش دهيد:


System.Diagnostics.Process.Start("sqlcmd.exe", "-s .\\sqlexpress -i C:\\Documents and Settings\\barbod\\Desktop\\Tala_stup\\1.sql\"");
در مورد راهنماي استفاده هم عرض کردم ؟/sqlcmd.exe

-s جهت انتخاب سرور
i- براي اينکه بگوييم script را اجرا کند.

mina.net
سه شنبه 12 آبان 1388, 19:59 عصر
سلام دوست عزیز هر کاری کردم نشد
برنامه رو گذاشتم اگه می شه بفرمایید اشکال از کجاست. بازم ممنون از کمکی که می کنید.

saied_genius
سه شنبه 12 آبان 1388, 23:38 عصر
شما توي قسمت C#‎‎ اومديد.

ولي پروژه تان با VB است. از اول بايد مي گفتيد با VB کار مي کنيد.

در هر صورت فايلتان را اصلاح کردم.

هم script ها را اصلاح کردم و هم خود برنامه را.

تست هم کردم ، جواب مي دهد ، مشکل ندارد.

موفق باشيد.

mina.net
چهارشنبه 13 آبان 1388, 07:31 صبح
شما توي قسمت C#‎‎‎‎ اومديد.

ولي پروژه تان با VB است. از اول بايد مي گفتيد با VB کار مي کنيد.

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

mina.net
چهارشنبه 13 آبان 1388, 08:00 صبح
سلام دوست عزیز
با تاسف باید بگم بازم نشد.
موقعی که این کد رو اجرا می کنم یک پنجره ای خیلی سریع ظاهر می شه و بسته می شه تونستم ازش عکس بگیرم
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39291&stc=1&d=1257310447
در صورتی که فابل وجود داره همچین خطای ظاهر می شه بارها آدرس رو چک کردم ولی بازم این خطا ظاهر می شه.

اَرژنگ
چهارشنبه 13 آبان 1388, 09:06 صبح
سلام دوست عزیز
با تاسف باید بگم بازم نشد.
موقعی که این کد رو اجرا می کنم یک پنجره ای خیلی سریع ظاهر می شه و بسته می شه تونستم ازش عکس بگیرم
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39291&stc=1&d=1257310447
در صورتی که فابل وجود داره همچین خطای ظاهر می شه بارها آدرس رو چک کردم ولی بازم این خطا ظاهر می شه.

سوال: چرا به جایه اینکه این اعمال را از خارج به داتابیس اعمال کنید در خود منجمنت استودیو اسکیو‌ال سرور انجام نمیدید؟ اینکه چطوری این روش به حل مشکلتان کمک میکنه را من نمیبینم.

mina.net
چهارشنبه 13 آبان 1388, 09:46 صبح
سوال: چرا به جایه اینکه این اعمال را از خارج به داتابیس اعمال کنید در خود منجمنت استودیو اسکیو‌ال سرور انجام نمیدید؟ اینکه چطوری این روش به حل مشکلتان کمک میکنه را من نمیبینم.
خوب در اون صورت برای هر کاربر باید به صورت جداگانه دیتابیسش رو بگیرم و تغییرات لازم رو انجام بدم ولی اگه این روشی که شما توضیح دادید رو عملی کنم فقط کافی هست تو برنامه یک گزینه برای اپدیت دیتابیس بزارم و فایل اسکریپ رو برای کاربرم بفرستم کاربر فقط مسیر فایل اسکریپت رو مشخص کرده و دیتابیسش آپدیت خواهد شد.
درست گفتم؟

saied_genius
چهارشنبه 13 آبان 1388, 12:11 عصر
سلام دوست عزیز
با تاسف باید بگم بازم نشد.
موقعی که این کد رو اجرا می کنم یک پنجره ای خیلی سریع ظاهر می شه و بسته می شه تونستم ازش عکس بگیرم
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39291&stc=1&d=1257310447
در صورتی که فابل وجود داره همچین خطای ظاهر می شه بارها آدرس رو چک کردم ولی بازم این خطا ظاهر می شه.

اروري که مي دهد مربوط به فاصله اي است که توي مسير فايل دارد.

برايتان آپديت کردم.

امتحان کنيد.

در ضمن همان قبلي را هم اگر مسير فايل را به \:C تغيير مي داديد ، مشکلتان حل مي شد.

موفق باشيد.

mina.net
چهارشنبه 13 آبان 1388, 14:12 عصر
شرمنده اینقدر شما رو اذیت کردم اگه ضروری نبود اینقدر وقت شما رو نمی گرفتم. اون خطا دیگه نمی یاد منتها خطای دیگری ظاهر می شه.
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39335&stc=1&d=1257333047

saied_genius
چهارشنبه 13 آبان 1388, 15:17 عصر
شرمنده اینقدر شما رو اذیت کردم اگه ضروری نبود اینقدر وقت شما رو نمی گرفتم. اون خطا دیگه نمی یاد منتها خطای دیگری ظاهر می شه.
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39335&stc=1&d=1257333047

سلام

خواهش مي کنم.

مشکلي نيست.

اين خطا مشکل نيست. مشکل از sql server است . احتمالاً شروع به کار نمي کند.

اين کار را امتحان کن و دباره برنامه را امتحان کن:

توي start بر روي run بزن ، سپس بزن cmd
توي پنجره باز شده بزن:

net start "sql server (sqlexpress)"

اين دستور باعث مي شود که اگر sql server هنوز run نشده ، اجرا بشه.

سپس دوباره برنامه را اجرا کن.

سوالي بود در خدمتم.

موفق باشيد.

mina.net
چهارشنبه 13 آبان 1388, 19:37 عصر
sql , run هست . دوباره اجرا کردم . توضیحاتی هم که شما دادید رو انجام دادم با این وجود نشد. بازم همون خطا قبلی. دیگه دارم کلافه می شم.

saied_genius
چهارشنبه 13 آبان 1388, 19:39 عصر
آخرين راه حل

شما script رو مستقيم توي sqlcmd اجرا کن ، يعني مسير و پارامتر ها و ... را توي cmd بزن اجرا کن، ببين اجرا مي کنه ،

يک راه ديگه هم script ها را توي sql management studio ببين درست اجرا مي کنه؟

mina.net
پنج شنبه 14 آبان 1388, 18:33 عصر
سلام دوست عزیز
موفق شدم با استفاده از sqlcommand این کار رو بکنم.


Dim sqlCom As New SqlClient.SqlCommand("", con)
If con.State = ConnectionState.Closed Then con.Open()
Dim CREATE_Text As String = "CREATE TABLE MyCustomers (CustID int IDENTITY (100,1) PRIMARY KEY, CompanyName nvarchar (50))"

With sqlcom
.Parameters.Clear()
.CommandText = CREATE_Text
.ExecuteNonQuery()
End With


فکر می کنم همین کار منو راه میندازه .کافی هست متغییر CREATE_Text از بیرون مقدار دهی بشه.
فقط چند تا کد می خوام.
1- اضافه کردن یک فیلد به یک جدول
2- حذف یک جدول
3- چک کردن وجود یک جدول
4- چک کردن وجود یک فیلد
اگه به همراه توضیحات باشه جیلی ممنون می شم.

saied_genius
پنج شنبه 14 آبان 1388, 19:03 عصر
1- اضافه کردن فيلد: قبلاً براتون گفتم.

2- حذف جدول: DROP TABLE table_name
نکته: هيچ فيلد جدول نبايد به عنوان foreign key در جدول ديگري باشد.

3- چک کردن وجود يک تيبل :

IF EXISTS (SELECT 1
FROM sysobjects
WHERE xtype='u' AND name='tablename')
SELECT 'tablename exists.'
ELSE
SELECT 'tablename does not exist.'

4- چک يک فيلد وجود دارد يا نه:

در مثال زير چک مي کند اگر وجود نداشته باشد اضافه مي کند:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMN WHERE TABLE_NAME = 'Contact' AND COLUMN_NAME = 'CountyCode')
ALTER TABLE Contact
ADD CountyCode nvarchar(10)

موفق باشيد.

mina.net
پنج شنبه 14 آبان 1388, 19:22 عصر
sysobjects , INFORMATION_SCHEMA.COLUMN ,Contact

سلام دوست عزیز اگه می شه در مورد موارد بالا توضیح بدید چیکار می کنن. و در مورد چک کردن وجود یا عدم وجود چی بگردونده خواهد شد یعنی چطور متوجه می شیم نتیجه چی بوده.
آیا منظور این است که اگه مقدار برگشتی "'tablename exists." وجود دارد و در غیر اینصورت خیر؟
همه اینها رو از طریق SQlcommand باید اجرا کرد دیگه؟
در ضمن آیا به نظر شما این روش برای می تونه همیشه یا حداقل 95% مواقع جوابگوی نیاز من باشه؟

saied_genius
پنج شنبه 14 آبان 1388, 19:28 عصر
ببينيد ...

اين ها مثال بودند ، خواهشاً کمي دقت کنيد!

عنوان هاي مورد نياز را با عناوين خود جايگزين کنيد.

چيزي را هم که گفتيد ثابت هاي sql است براي در آوردن اطلاعات مورد نظر.

2- در مورد وجود و يا عدم وجود true false بر مي گرداند ولي نياز به مقدار بازگشتي نيست ، چون شما بايد عمليات را توي خود script انجام دهيد (اصوليش همينه) و نياز نيست توي محيط برنامه نويسي چک شود.


موفق باشيد.

mina.net
پنج شنبه 14 آبان 1388, 20:37 عصر
با عرض شرمندگی مجدد
از کد ایجاد و چک کردن table تونستم به درستی استفاده کنم. ولی برای چک کردن و سپس ایجاد فیلد موفق نشدم. من از کد شما به شکل زیر استفاده کردم


CREATE_Text = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMN WHERE" + _
" TABLE_NAME = 'MyOrders' AND COLUMN_NAME = 'CountyCode')ALTER TABLE" + _
" Contact ADD CountyCode nvarchar(10)"

از این هم استفاده کردم.


CREATE_Text = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMN WHERE" + _
" TABLE_NAME = 'MyOrders' AND COLUMN_NAME = 'CountyCode')ALTER TABLE" + _
" MyOrders ADD CountyCode nvarchar(10)"

که برای هر دو خطای syntax
Incorrect syntax near the keyword 'COLUMN'. ظاهر شد. که نمی دونم برای چی هست اگه می شه توضیح بفرمایید.

saied_genius
پنج شنبه 14 آبان 1388, 23:07 عصر
با عرض شرمندگی مجدد
از کد ایجاد و چک کردن table تونستم به درستی استفاده کنم. ولی برای چک کردن و سپس ایجاد فیلد موفق نشدم. من از کد شما به شکل زیر استفاده کردم


CREATE_Text = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMN WHERE" + _
" TABLE_NAME = 'MyOrders' AND COLUMN_NAME = 'CountyCode')ALTER TABLE" + _
" Contact ADD CountyCode nvarchar(10)"
از این هم استفاده کردم.


CREATE_Text = "IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMN WHERE" + _
" TABLE_NAME = 'MyOrders' AND COLUMN_NAME = 'CountyCode')ALTER TABLE" + _
" MyOrders ADD CountyCode nvarchar(10)"
که برای هر دو خطای syntax
Incorrect syntax near the keyword 'COLUMN'. ظاهر شد. که نمی دونم برای چی هست اگه می شه توضیح بفرمایید.


معذرت مي خواهم ، اشتباه از من بوده ، به اين صورت اصلاح بفرماييد:


IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME = 'MyOrders' AND COLUMN_NAME = 'CountyCode')ALTER TABLE
MyOrders ADD CountyCode nvarchar(10)

موفق باشيد.