دسته بندی ها
18:36 1398/11/09

دلیل خطای The underlying provider failed on Open چیست

مشخصات سوال کننده :
کاربر : sobhan     امتیاز کاربر : 6     رتبه کاربر : 80
دسته بندی : سی شارپ WPF

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 7510
پاسخ دهنده : saedbfd 14:44 1398/11/10

با سلام

نکته اول اینکه خطای The Underlying Provider faild to open یعنی در اتصال به بانک اطلاعاتی اشکالی وجود داره که عملا یعنی کانکشن استرینگ شما مشکل داره.

 

در مورد استفاده بیش از یک دیتابیس در پروژه قبلا تجربه داشتم. نکته اول اینکه این کار زیاد منطقی و اصولی نیست خصوصا اگر پروژه شما وب باشه و با Asp.net core  باشه. چون در این صورت مشکلات بسیار زیادی رو خواهید داشت. خصوصا در استفاده از امکانات اهراز هویت و Identity.

 

اما اگر پروژه شما ویندوز هست بهترین راه حل این هست که کانکشن رو به صورت ثابت در فایل app.config تعریف نکنید چون در این صورت برنامه نمی دونه با کدوم کانکشن باید کار کنه.

شما باید کانکشن رو به صورت داینامیک تبدیل کنید و موقع ورود کاربر به سیستم یک کمبوباکس بذارید و از کاربر بپرسید با کدوم دیتابیس میخواد وارد برنامه بشه و هر دیتابیسی رو که انتخاب کرد کانکشن استرینگ مخصوص رو ایجاد کنید و با دیتابیس کار کنید.

 

البته میتونید از طریق EndPoint ها توی Sql Server بین 2 دیتابیس ارتباط برقرار کنید ولی راه حل قبلی راحتتر و بهتر هست فکر کنم.

ویرایش شده در پنج شنبه 10 بهمن 1398 ساعت 14:46:11
به این پاسخ امتیاز بدهید    0
امتیاز: 1654 رتبه: 1
پاسخ دهنده : sobhan 16:07 1398/11/10

سلام خدمت استاد گرامی 

ممنونم بابت پاسختون 

من بعد از ایجاد دیتابیس دومم اون رو فقط موقع ذخیره عکس ازش استفاده کرده بودم و این اخطار رو میده 

 

الان بعد فرمایش شما برای تست 

یه فرم جدید ایجاد کردم و اطلاعات داخل تیبل دیتابیس دومم رو ریختم تو دیتاگرید 

الان بدون مشکل اون اطلاعات رو میاره و سرچ هم داخلش میزم 

 

فکر کنم مشکل از کانکشن استرینگ نباشه ،  درسته ؟ 

 

موقع ذخیره عکس به مشکل میخودم 

sp مورد نظرم هم مشکل خاصی نداره 

موقع دیباگ کردن هم اطلاعات مد نظرم  درستن و دارن با SP ارسال میشن 

 

فقط یه سوال شما تو آموزشتون نوع فیلد عکس رو توو دیتابیس از نوع image گرفتین

ولی من از نوع varbinary(MAX) گرفتم 

البته این مسئله رو هم با عوض کردن نوع فیلد به image تست کردم و دوباره همین اخطار رو داد 

 

 

به این پاسخ امتیاز بدهید    0
امتیاز: 6 رتبه: 80
پاسخ دهنده : sobhan 16:14 1398/11/10

متن کامل خطا رو میفرستم 

امکان داره Sp  مشکل داشته باشه مثلا عکس باینری نشه (البته تودیباگ ظاهرا درس داره باینری میشه )

 

موندم دیگه 

 

System.Data.Entity.Core.EntityException: The underlying provider failed on Open.
 ---> System.Data.SqlClient.SqlException: MSDTC on server 'SETABRAN-PC' is unavailable.\r\n   
 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n   
 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n  
 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n   
 at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n
 at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()\r\n 
 at System.Data.SqlClient.SqlDataReader.get_MetaData()\r\n   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)\r\n
 at System.Data.SqlClient.TdsParser.GetDTCAddress(Int32 timeout, TdsParserStateObject stateObj)\r\n
 at System.Data.SqlClient.SqlInternalConnectionTds.GetDTCAddress()\r\n
 at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)\r\n
 at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)\r\n
 at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)\r\n
 at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)\r\n
 at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)\r\n
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)\r\n
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)\r\n
 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)\r\n
 at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)\r\n
 at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)\r\n
 at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)\r\n   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)\r\n
 at System.Data.SqlClient.SqlConnection.Open()\r\n
 at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)\r\n 
 at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)\r\n 
 at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)\r\n
 at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()\r\n
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()\r\n
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)\r\n
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open()\r\n
 --- End of inner exception stack trace ---\r\n
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open()\r\n
 at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)\r\n
 at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)\r\n
 at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass4b.<ExecuteFunction>b__49()\r\n
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)\r\n
 at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters)\r\n
 at DataModelLayer.SystemFileEntities.Sp_tblPersenelAx_ins(Nullable`1 persenelID, Nullable`1 perseneShomare, Byte[] persenelAx, Nullable`1 userIdRef) in E:\\Kaneh\\ Amozesh\\C#\\System\\System\\System\\DataModelLayer\\FileModel.Context.cs:line 50\r\n
 at System.windows.Win_PersenelEdit.Save() in E:\\Kaneh\\ Amozesh\\C#\\System\\System\\System\\System\\windows\\Win_PersenelEdit.xaml.cs:line 650"

 خط آخر دقیقا داره به خط شروع SP اشاره میکنه

Win_PersenelEdit.xaml.cs:line 650

ویرایش شده در پنج شنبه 10 بهمن 1398 ساعت 16:16:15
به این پاسخ امتیاز بدهید    0
امتیاز: 6 رتبه: 80
پاسخ دهنده : sobhan 23:04 1398/11/10

دیگه بیخیال شدم

همون جدول رو توو دیتابیس اصلی زدم

به این پاسخ امتیاز بدهید    0
امتیاز: 6 رتبه: 80
پاسخ دهنده : fateme 23:59 1398/11/10

اگر شما یک دیتابیس فقط برای ذخیره عکس دارید منطقی نیست زیاد. بعد چجوری میخواید تعیین کنید کدوم عکس مربوط به چه رکوردی هست توی اون یکی دیتابیس ؟

بهترین راه حل اینه که مثل وب عکسها رو در یک مسیری در کنار پروژه قرار بدید و فقط اسمش رو توی دیتابیس ذخیره کنید. این کار خیلی مزایا داره

  • پیاده سازی راحتتر
  • حجم دیتابیس بشدت کمتر میشه
  • سرعت دیتابیس خیلی بالاتره اینجوری
  • نیازی هم به دو دیتابیس نیست
به این پاسخ امتیاز بدهید    0
امتیاز: 1617 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود