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

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

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

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 7621
هوش مصنوعی

پاسخ هوش مصنوعی

سلام، خطای "The underlying provider failed on Open" معمولاً به دلایل مختلفی ممکن است اتفاق بیفتد. در زیر به برخی از دلایل رایج این خطا و نحوه رفع آن اشاره می کنم:

  1. ارتباط با دیتابیس: اطمینان حاصل کنید که سرور دیتابیس در حال اجرا است و به درستی پیکربندی شده است. همچنین بررسی کنید که آدرس و نام پایگاه داده در connection string درست وارد شده باشد.

  2. مجوزها: اطمینان حاصل کنید که کاربر "sa" دارای مجوزهایی برای دسترسی به پایگاه داده "SystemFile" است. ممکن است نیاز به تنظیمات خاصی برای مجوزها داشته باشید.

  3. سازگاری ورژن Entity Framework: اگر از ورژن های خاصی از Entity Framework یا SqlClient استفاده می کنید، ممکن است برخی از تنظیمات لازم باشد که بررسی شود.

  4. وضعیت شبکه: اگر دیتابیس بر روی یک سرور دیگری است، مطمین شوید که شبکه بین اپلیکیشن و سرور دیتابیس به درستی پیکربندی شده و دسترسی به آن وجود دارد.

برای رفع این خطا:

  1. ابتدا اتصال به سرور دیتابیس را با استفاده از SQL Server Management Studio یا ابزار مشابهی بررسی کنید.
  2. سپس مطمین شوید که connection string شما صحیح است و نیازمندی های احراز هویت نیز به درستی پیکربندی شده اند.
  3. اگر هنوز با مشکل مواجه هستید، سعی کنید با فراهم کردن اطلاعات بیشتر در مورد سرور و پورت، خطا را عیب یابی کنید.

در مورد سوال دوم شما:

استفاده از دو دیتابیس در یک اپلیکیشن به صورت همزمان امکان پذیر است، اما نیاز به تنظیمات خاصی دارد و شما به درستی از آن استفاده کرده اید. فقط مطمین شوید که هر نوع وابستگی بین دو دیتابیس را مدیریت کنید.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : 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
امتیاز: 1664 رتبه: 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
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود