بک آپ گیری پایگاه داده SQl در #C
با سلام
من چندتا سوال راجع به بک آپ گیری داشتم.:متفکر:
1.به چند روش میتوان از یک پایگاه داده بک آپ گرفت؟البته باکد در #C
2.بهترین روش برای بک آپ گیری چه روشی میباشد؟
3.لزوما باید هر روز بک آپ گرفت یا نه؟
4.آیا میتوان در #C بک آپ ها را هم ریستور کرد؟
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
علیکم السلام
نقل قول:
.به چند روش میتوان از یک پایگاه داده بک آپ گرفت؟
با استفاده از دستورات SQL میشه بک اپ گرفت
نقل قول:
.بهترین روش برای بک آپ گیری چه روشی میباشد؟
من از Store Procedure استفاده می کنم که هم سریع است و هم مطمئن و نهایتا بی دردسر
نقل قول:
لزوما باید هر روز بک آپ گرفت یا نه؟
این با اهمیت و میزان ورود اطلاعات بانک ارتباط مستقیم دارد
نقل قول:
آیا میتوان در C# بک آپ ها را هم ریستور کرد؟
به این مثال توجه کنید:
internal void MakeRestore(string BAK_Path)
{
SqlParameter[] p = new SqlParameter[3];
p[1] = new SqlParameter("@DBname", "DataBaseName");
p[2] = new SqlParameter("@path", BAK_Path);
con.Open();
SqlCommand sql_cmd = new SqlCommand("ProcedureName", con);
sql_cmd.CommandType = CommandType.StoredProcedure;
sql_cmd.Parameters.AddWithValue(parameter[1].ParameterName, parameter[1].Value);
sql_cmd.Parameters.AddWithValue(parameter[2].ParameterName, parameter[2].Value);
sql_cmd.ExecuteNonQuery();
con.Close();
{
حال پروسیجر مربوطه را به صورت زیر معرفی می کنیم:
Create PROCEDURE [dbo].[ProcedureName].[]
-- Add the parameters for the stored procedure here
@Path char(50),
@DBname char(20)
AS
BEGIN
restore DATABASE @DBname
from DISK = @path
WITH REPLACE
END
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
مرسی از دوستان
حالا این پروسیجر رو باید تو #C بنویسم یا تو SQl ?
3 ضمیمه
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
به 2 روش میشه نوشت:
1:
کوری که در مثال قبل نوشتم را تو محیط SQL بنویس و Excute کن.
2:(راحت تر)
به ترتیب تصاویر:
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
البته یه روش دیگه هست که از همه راحتر و سریعتر هست که از(Typed DatSet) Wizard استفاده می شه که اگه لازم داری توضیح می دم ولی الان نمی تونم...
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
من کدی که تو #C مینویسم به parameter ارور میده.:اشتباه:
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
منم چیزی از لینک چیزی دستگیرم نشد
چیزی که من برداشت می کنم اینه
باید یه استورد پروسیجر داشته باشم (که یا با کد از #C می تونیم درست کنیم و یا قبلا تو خود دیتا بیس ایجاد کرده باشیم)
و سپس با فراخوانی آن و دادن آدرس و اسم فایل یه فایل بک آپ ایجاد کینم
استفاده از استورد پروسیجر سرعت رو بالا میبره
ولی می تونیم از خود سی شارپ هم با کد اس کیو ال بک آپ رو بگیریم و سرعت و کاراییش فکر کنم از استورد پروسیچر کمتر باشه
درسته دوستان؟
5 ضمیمه
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
باز هم سلام
اگه برای ساختن Procedure عجله داشته باشیم و یا Procedure های زیادی باید درست کنیم از روش زیر استفاده کنید. این روش نیازی به کد نویسی زیادی ندارد و تا حدودی کار آدم رو راه می ندازه
در این روش از Typed DataSet استفاده می کنیم.
البته من از Typed DataSet فقط برای تولید Procedure استفاده می کنم و پس از اتمام کار می توان آن را پاک کرد. و اما اصل ماجرا:
3 ضمیمه
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
سلام دوستان
لطفا یکی از دوستان حرفه ای این مشکل منو بررسی کنه که چطور میش حلش کرد
من از دیتا بیس بک آپ می گیرم ولی در هر دو حالت (از خود اس کیو ال سرور و از داخل سی شارپ (کد برنامه )) فقط به یک فایل خاص بک آپ می گیره
فایلی که در مسیر خود اس کیو ال سرور و در داخل دایرکتوری بک آپ هستش ، بک آپ می گیره ولی وقتی حتی این فایل رو به یه جای دیگه مانند F: کپی می کنم ارور زیر رو میده
TITLE: Microsoft SQL Server Management Studio
------------------------------
Backup failed for Server 'SERVER'. (Microsoft.SqlServer.SmoExtended)
------------------------------
ADDITIONAL INFORMATION:
System.Data.SqlClient.SqlError: Cannot open backup device 'F:\FullBackup.bak'. Operating system error 5(failed to retrieve text for this error. Reason: 1815). (Microsoft.SqlServer.Smo)
یعنی وقتی حتی از داخل برنامه مسیر
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FullBackup .bak
رو انتخاب می کنم بک آپ با موفقیت گرفته میشه ولی وقتی همین فابل رو به مسیری مانند F:\FullBackup.bak کپی کردیم و این فایل رو انتخاب کردیم خطای بالا رو میده
آیا قابل حل شدن هست؟
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
اگر فایل دیتابیس رو کپی کنیم و برای ریستور از کپی استفاده کنیم اشکالی داره؟! من خودم این کارو میکنم مشکلی نداره ... ولی یک از دوستان ایراد گرفت و منو دو دل کرد؟!
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
روش من :
رستور..
private void restore_backup_Click(object sender, EventArgs e)
{
objconnection.Open();
if (openFileDialog_restore.ShowDialog() == DialogResult.OK)
if (openFileDialog_restore.FileName.EndsWith(".bak") == true)
{
MessageBox.Show("برای تکمیل بازیابی اطلاعات، برنامه دوباره اجرا خواهد شد، چند لحظه صبر کنید...", "",MessageBoxButtons.OK,MessageBoxIcon.Information ,MessageBoxDefaultButton.Button2,MessageBoxOptions .RtlReading);
string s1 = "ALTER DATABASE [" + Application.StartupPath + "\\sodour.mdf] SET OFFLINE WITH ROLLBACK IMMEDIATE";
string s2 = "ALTER DATABASE [" + Application.StartupPath + "\\sodour.mdf] SET MULTI_USER";
string query = "RESTORE DATABASE [" + Application.StartupPath + "\\sodour.mdf] FROM DISK ='" + openFileDialog_restore.FileName + "' WITH RECOVERY,REPLACE";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = s1;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();
cmd.CommandText = s2;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();
cmd.CommandText = query;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();
cmd.Dispose();
Application.Restart();
}
else
FarsiMessageBox.FMessageBox.Show("فایل با پسوند .bak انتخاب کنید", "خطا", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Error, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;
}
بکآپ..
{
if (saveFileDialog_backup.ShowDialog() == DialogResult.OK)
{
string command = @"BACKUP DATABASE [" + Application.StartupPath + "\\sodour.mdf] TO DISK = N'"+saveFileDialog_backup.FileName+"' WITH FORMAT, INIT, NAME = N'accounting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
if (objconnection.State != ConnectionState.Open)
objconnection.Open();
oCommand = new SqlCommand(command, objconnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
objconnection.Close();
FarsiMessageBox.FMessageBox.Show("فابل پشتیبان ذخیره شد", "", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Information, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;
oCommand.Dispose();
}
}
خیلی خوب و سریع کار میکنه
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
نقل قول:
نوشته شده توسط
حجتی نیا
روش من :
}[/code]بکآپ..
{
if (saveFileDialog_backup.ShowDialog() == DialogResult.OK)
{
string command = @"BACKUP DATABASE [" + Application.StartupPath + "\\sodour.mdf] TO DISK = N'"+saveFileDialog_backup.FileName+"' WITH FORMAT, INIT, NAME = N'accounting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
if (objconnection.State != ConnectionState.Open)
objconnection.Open();
oCommand = new SqlCommand(command, objconnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
objconnection.Close();
FarsiMessageBox.FMessageBox.Show("فابل پشتیبان ذخیره شد", "", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Information, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;
oCommand.Dispose();
}
}
خیلی خوب و سریع کار میکنه
دوست من دیتا بیس شما روی فایل ولی من از خود اس کیو ال استفاده می کنم
شما آدرس فایل دیتا بیس رو میدی ولی من دستورات رو به خود اس کیو ال سرور ارسال می کنم ، این عمل باید تو شبکه هم جواب بده
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
من تا پيك شما را نخوندم ولي براي بك آپ و ريستور من كد زير را پيشنهاد مكنم من حتي در سيستم مقصد هم جواب گرفتم https://barnamenevis.org/showth...=218782&page=3
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
نقل قول:
نوشته شده توسط
csharpprogramer88
دوست من ، من کل این تاپیک ها رو خوندم
مشکل من یه چیز دیگست اگه تاپیک شماره 15 رو بخونین می بینید که تو خود اس کیو ال سرور هم من این خطا رو دارم
من با استفاده از این دستورات در مسیر خاصی از هاد دیسک می تونم بک آپ بگیرم ولی در مسیر ها دیگه اجازه نمی ده
متن خطا رو هم نوشتم
نقل قول: بک آپ گیری پایگاه داده SQl در C#?
نقل قول:
نوشته شده توسط
hojjatshariffam
سلام دوستان
لطفا یکی از دوستان حرفه ای این مشکل منو بررسی کنه که چطور میش حلش کرد
من از دیتا بیس بک آپ می گیرم ولی در هر دو حالت (از خود اس کیو ال سرور و از داخل سی شارپ (کد برنامه )) فقط به یک فایل خاص بک آپ می گیره
فایلی که در مسیر خود اس کیو ال سرور و در داخل دایرکتوری بک آپ هستش ، بک آپ می گیره ولی وقتی حتی این فایل رو به یه جای دیگه مانند F: کپی می کنم ارور زیر رو میده
TITLE: Microsoft SQL Server Management Studio
------------------------------
Backup failed for Server 'SERVER'. (Microsoft.SqlServer.SmoExtended)
------------------------------
ADDITIONAL INFORMATION:
System.Data.SqlClient.SqlError: Cannot open backup device 'F:\FullBackup.bak'. Operating system error 5(failed to retrieve text for this error. Reason: 1815). (Microsoft.SqlServer.Smo)
یعنی وقتی حتی از داخل برنامه مسیر
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FullBackup .bak
رو انتخاب می کنم بک آپ با موفقیت گرفته میشه ولی وقتی همین فابل رو به مسیری مانند F:\FullBackup.bak کپی کردیم و این فایل رو انتخاب کردیم خطای بالا رو میده
آیا قابل حل شدن هست؟
یکی از دوستان حرفه ای مشکل منو حل کنه
ضمنا تنها روشی که خطا نمی دیه پست شماره 10 در تاپیک زیر هست که علتشم اینه
https://barnamenevis.org/showthread.php?t=218782
علتش اینه که در این روش آدرس محل بک آپ گیری اسکیو ال سرور از داخل رجیستری ویندوز گرفته شده و بک آپ اونجا گرفته میشه بعد یه کپی از فایل بک آپ گرفته شده به محل مورد نظر ما کپی میشه .
که معمولا آدرسی شبه اینه:
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FileName.b ak
من می خوام بدونم که چرا حتی خود اس کیو ال سرور نیز نمی تونه بجز این دایرکتوری به جاهای دیگه بک آپ بگیره، آیا تنظیمات خاصی لازمه؟
البته شده که من خودم در برخی مواقع تونستم که به مسیر های دیگری هم بک آپ بگیرم ولی نه همیشه ، فقط برخی مواقع
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
واسه بکاپ گرفتن از sql 2000 از کتابخونه sqldmo و واسه نسخه 2005 به بعد باید از sqlsmo استفاده کنید
حواستون باشه sqldmo روی 2005 به بعد وجود نداره و استفاده نمیشه
نقل قول: بک آپ گیری پایگاه داده SQl در #C?
علت اینکه با SQLServer نمی تونید برخی جا ها بک آپ بگیرید اینه که ویندوز پرمیشن نمی ده
من این مشکل رو داشتم تنها راه حلش اینه که به پوشه مقصد به صورت دستی یا با برنامه نویسی به Everyone پرمیشن بدی
اینجا نوشته چطوری به صورت دستی می تونی به یک پوشه پرمیشن بدی:
https://msdn.microsoft.com/en-us/library/bb727008.aspx
ولی اگر می خوای به صورت برنامه نویسی پرمیشن بدی این کلاسیه که من ساختم و ازش استفاده می کنم:
public class fPer
{
public static bool AlowFolPer(string StrPath)
{ return AlowFolPer(StrPath, true); }
public static bool AlowFolPer(string StrPath, bool SubFooldersAndFiles)
{ return AlowFolPer(StrPath, SubFooldersAndFiles, "Everyone"); }
public static bool AlowFolPer(string StrPath, string strUser)
{ return AlowFolPer(StrPath, true, strUser); }
public static bool AlowFolPer(string StrPath, bool SubFooldersAndFiles, string strUser)
{
if (!System.IO.Directory.Exists(StrPath))
return false;
try
{
DirectorySecurity dSecurity = Directory.GetAccessControl(StrPath);
FileSystemAccessRule fsar;
//fsar = new FileSystemAccessRule(strUser, FileSystemRights.FullControl, AccessControlType.Allow);
fsar = new FileSystemAccessRule(strUser, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
dSecurity.AddAccessRule(fsar);
try
{
Directory.SetAccessControl(StrPath, dSecurity);
}
catch (Exception) { return false; }
if (SubFooldersAndFiles)
{
bool blnOk = true;
foreach (string x in Directory.GetDirectories(StrPath))
blnOk = blnOk && AlowFolPer(x, true, strUser);
foreach (string x in Directory.GetFiles(StrPath))
blnOk = blnOk && AlowFilePer(x, strUser);
return blnOk;
}
else
return true;
}
catch (Exception) { return false; }
}
public static bool AlowFilePer(string StrPath)
{ return AlowFilePer(StrPath, "Everyone"); }
public static bool AlowFilePer(string StrPath, string strUser)
{
FileSecurity fSecurity = File.GetAccessControl(StrPath);
FileSystemAccessRule fsar = new FileSystemAccessRule(
strUser
, FileSystemRights.FullControl
//, InheritanceFlags.None , PropagationFlags.NoPropagateInherit
, AccessControlType.Allow);
fSecurity.AddAccessRule(fsar);
try
{
File.SetAccessControl(StrPath, fSecurity);
return true;
}
catch (Exception)
{ return false; }
}
}
Using های مورد نیاز این کلاس:
using System.Security.AccessControl;
using System.IO;
حالا هنگام بکاپ گیری هر پوشه ای رو که کاربر برای ذخیره فایل بکاپ ذخیره کرد اول این دستور رو اجرا کن:
fPer.AlowFolPer(backUpFoolder, true);
اگر جایی از حرفام گنگ بود بگین توضیح بدم