مشکل بکاپ گیری از دیتابیس در برنامه
سلام خدمت دوستان
برای بکاپ گیری از دیتابیس توسط کاربر برنامه یه Stored Procedure تعریف شده توو اسکیوال به درستی کار میکنه
اما هنگام اجرا سمت برناممه اخطار میده هرچی گشتم نفهمیدم علتش چه
اگه امکانداره راهنمایم کنید
متن خطا :
"System.Data.Entity.Core.EntityCommandExecutionException:
An error occurred while executing the command definition. See the inner exception for details. --->
System.Data.SqlClient.SqlException: Cannot perform a backup or restore operation within a transaction.
nBACKUP DATABASE is terminating abnormally.
at System.Data.SqlClient.SqlConnection.OnError
(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.Execute(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.EntityCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.EntityCommand.ExecuteNonQuery()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunctionCommand(EntityCommand entityCommand)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass4b.<ExecuteFunction>b__4a()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass4b.<ExecuteFunction>b__49()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters)
at DataModelLayer.SystemDBEntities.Sp_BackupDatabaseSystemDB(String backupString) in D:\\C#\\System\\System\\System\\DataModelLayer\\DataModel.Context.cs:line 2370
at System.windows.Min.MenuItem_Click(Object sender, RoutedEventArgs e) in D:\\C#\\System\\System\\System\\System\\windows\\Min.xaml.cs:line 149"
کدی که سمت برنامه اجرا میشه:
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "System" + String.Format("{0:yyyyMMdd}", Convert.ToDateTime(calender.Text))+ "-"+ DateTime.Now.ToString("HHmmss"); // Default file name
dlg.DefaultExt = ".bak";
dlg.Filter = "Database Backup (.bak)|*.bak";
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
SaveDB = dlg.FileName;
}
try
{
Db.Sp_BackupDatabaseSystemDB(
SaveDB);
Db.SaveChanges();
MessageBox.Show($"نسخه پشتیبان دیتابیس " + "\n" +
"با موفقیت تهیه شد",
$"نسخه پشتیبان دیتابیس",
MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading);
}
catch (Exception ex)
{
MessageBox.Show("هنگام تهیه نسخه پشتیبان اطلاعات در دیتابیس مشکلی بوجود آماده لطفاً دوباره سعی کنید" + ex.ToString(), "خطای ارتباطی");
}
finally
{
}
}
Stored Procedure :
ALTER procedure [dbo].[Sp_BackupDatabaseSystemDB]
@BackupString nvarchar(max)
as
backup database SystemDB to disk=@BackupString with compression
ممنون میشم کمکم کنید
برای ذخیره سازی BackUp بهتره که آدرس بک آپ گیری توی درایو C یا درایوی که ویندوز توی اون نصب شده نباشه. با توجه به متن خطا ظاهرا مسیری که برای بک آپ گیری انتخاب کردید مناسب نیست یا در لحظه ای که داره بک آپ گرفته میشه اون مسیر توسط تراکنش دیگه ای درگیر هست. البته این یک فرضیه هست.
برای بک آپ گیری بنظرم مستقیم دستور زیر رو از طریق دستورات Sql توی برنامه اجرا کنید و نیازی به یک SP هم نیست
BackUp DataBase DataBaseName To Disk = 'path' With Compression
یکبار یک مسیر در یک درایو دیگه بهش بدید اگر مجدد خطا داشت اعلام کنید
تو این لینک اگه درست متوجه شده باشم گفته با این دستور میشه ولی نتونستم اجررا کنم یوزینگ رو هم انجام دادم
db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
به جای sql وقتی SP خودم رو میزام قبول نمیکنه
با پارامتر ُSaveDB ظاهرا مشکلی نداره
فکر کنم به این شکل باشه
var sql = "backup database SystemDB to disk = {0} with compression";
Db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, SaveDB);
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- حذف کامل یک رکورد در جدول ریلیشن شده
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf