باسلام به همه عزیزان
برای کار با فایل ها و عکس ها تو برنامه می خوام از دوتا دیتابیس استفاده کنم
کانکشن استرینگ ها هم به این صورت هستن
<connectionStrings>
<add name="SystemDBEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=SystemDB;persist security info=True;user id=sa;password=1;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="SystemFileEntities1" connectionString="metadata=res://*/FileModel.csdl|res://*/FileModel.ssdl|res://*/FileModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=SystemFile;user id=sa;password=1;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
مدل داده ایم هم تو فرم
SystemDBEntities Db = new SystemDBEntities();
SystemFileEntities1 DbFile = new SystemFileEntities1();
حالا وقتی میخوام با دیتابیس فایم کار کنم اخطار میده
متن اخطار:
System.Data.Entity.Core.EntityException: 'The underlying provider failed on Open
دو تا سوال داشتم از خدمت دوستان و اساتید گرامی
1 اصلا کاری که کردم درست استفاده از دو تا دیتابیس و روش استفادم
2 این خطارو چطوری رفعش کنم
ظاهرا به کنکشن استرینگ خطا میگیره
با سلام
نکته اول اینکه خطای The Underlying Provider faild to open یعنی در اتصال به بانک اطلاعاتی اشکالی وجود داره که عملا یعنی کانکشن استرینگ شما مشکل داره.
در مورد استفاده بیش از یک دیتابیس در پروژه قبلا تجربه داشتم. نکته اول اینکه این کار زیاد منطقی و اصولی نیست خصوصا اگر پروژه شما وب باشه و با Asp.net core باشه. چون در این صورت مشکلات بسیار زیادی رو خواهید داشت. خصوصا در استفاده از امکانات اهراز هویت و Identity.
اما اگر پروژه شما ویندوز هست بهترین راه حل این هست که کانکشن رو به صورت ثابت در فایل app.config تعریف نکنید چون در این صورت برنامه نمی دونه با کدوم کانکشن باید کار کنه.
شما باید کانکشن رو به صورت داینامیک تبدیل کنید و موقع ورود کاربر به سیستم یک کمبوباکس بذارید و از کاربر بپرسید با کدوم دیتابیس میخواد وارد برنامه بشه و هر دیتابیسی رو که انتخاب کرد کانکشن استرینگ مخصوص رو ایجاد کنید و با دیتابیس کار کنید.
البته میتونید از طریق EndPoint ها توی Sql Server بین 2 دیتابیس ارتباط برقرار کنید ولی راه حل قبلی راحتتر و بهتر هست فکر کنم.
سلام خدمت استاد گرامی
ممنونم بابت پاسختون
من بعد از ایجاد دیتابیس دومم اون رو فقط موقع ذخیره عکس ازش استفاده کرده بودم و این اخطار رو میده
الان بعد فرمایش شما برای تست
یه فرم جدید ایجاد کردم و اطلاعات داخل تیبل دیتابیس دومم رو ریختم تو دیتاگرید
الان بدون مشکل اون اطلاعات رو میاره و سرچ هم داخلش میزم
فکر کنم مشکل از کانکشن استرینگ نباشه ، درسته ؟
موقع ذخیره عکس به مشکل میخودم
sp مورد نظرم هم مشکل خاصی نداره
موقع دیباگ کردن هم اطلاعات مد نظرم درستن و دارن با SP ارسال میشن
فقط یه سوال شما تو آموزشتون نوع فیلد عکس رو توو دیتابیس از نوع image گرفتین
ولی من از نوع varbinary(MAX) گرفتم
البته این مسئله رو هم با عوض کردن نوع فیلد به image تست کردم و دوباره همین اخطار رو داد
متن کامل خطا رو میفرستم
امکان داره 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
دیگه بیخیال شدم
همون جدول رو توو دیتابیس اصلی زدم
اگر شما یک دیتابیس فقط برای ذخیره عکس دارید منطقی نیست زیاد. بعد چجوری میخواید تعیین کنید کدوم عکس مربوط به چه رکوردی هست توی اون یکی دیتابیس ؟
بهترین راه حل اینه که مثل وب عکسها رو در یک مسیری در کنار پروژه قرار بدید و فقط اسمش رو توی دیتابیس ذخیره کنید. این کار خیلی مزایا داره
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
350
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
319
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4270
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4283
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3876
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
662
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3174
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3251
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2013
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
78
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
111
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1034
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
430
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
931
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4800
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|