System.Data.Odbc.OdbcException (0x80131937) 发布后,我无法使用 Odbc 功能读取、删除和写入访问 mdb 文件
Posted
技术标签:
【中文标题】System.Data.Odbc.OdbcException (0x80131937) 发布后,我无法使用 Odbc 功能读取、删除和写入访问 mdb 文件【英文标题】:System.Data.Odbc.OdbcException (0x80131937) After publishing I cannot use Odbc functionality to read, delete, and write into an access mdb file 【发布时间】:2019-09-17 18:44:08 【问题描述】:无法连接 OdbcConnection Microsoft Access 驱动程序 - 发布后 System.Data.Odbc.OdbcException (0x80131937)
发布应用程序后,我失去了 OdbcConnection/Command 功能。
下面的代码是应用程序在发布时出错的地方。所有这些都在开发中。
//Connect to access .mdbcd
var conn = new OdbcConnection(@"Driver=Microsoft Access Driver (*.mdb, *.accdb);Dbq=D:\wwwroot\mo22\storesales.mdb");
conn.Open();
//Clear out table
OdbcCommand Com = conn.CreateCommand();
Com.CommandText = "DELETE FROM tblAcctData";
Com.ExecuteNonQuery();
returnList.ForEach(el =>
OdbcCommand thisCmd = conn.CreateCommand();
thisCmd.CommandText = "INSERT INTO [tblAcctData] ([Store], [ProcDate], [Name], [Amount]) VALUES('" + el.Store + "', #" + el.proc_date + "#, '" + el.Name + "', " + el.amount + ")";
thisCmd.ExecuteNonQuery();
);
//Close connection
conn.Close();
到目前为止,我有 - 将 Microsoft Access 添加到服务器。 - 在系统数据源中添加了 32 位和 64 位驱动程序。 - 使用附加凭据编辑连接字符串。 -尝试扩展AnsiSQL = 1;在连接字符串中。
当我在系统数据源中添加 64 位驱动程序(Microsoft Access Driver (.mdb,.accdb))时,日志中不再出现错误,并且出现此错误在前端。
t headers: e, status: 502, statusText: "Bad Gateway", url: "http://apps.o.com/mochub2/api/acctlegenddata/getdata?stores=01&date=9/2/2019", ok: false, ...
所以我觉得我有点到了某个地方,因为没有 odbc 错误。只是一个错误,说我的网关不好。
有人知道接下来的步骤是什么吗?
这是没有 64 位 Microsoft Access 驱动程序的错误。
System.Data.Odbc.OdbcException (0x80131937) at System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection connection, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle) at System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection, OdbcConnectionString连接选项)在 System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningObject)在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionOptions userOptions)在系统.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接) 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试, DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.Odbc.OdbcConnection.Open () 在 mocHub2.Controllers.AcctLegendDataController.GetData(String stores, DateTime date) 在 C:\Ang\Controllers\AcctLegendDataController.cs:line 330 at lambda_method(Closure , Object , Object[] ) 在 Microsoft.Extensions.Internal.ObjectMethodExecutor .Execute(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker .InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerAc Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore .Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker .Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Routing 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()。 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.A 的 EndpointMiddleware.Invoke(HttpContext httpContext) uthentication.AuthenticationMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context) )
【问题讨论】:
在你走得太远之前,请阅读this。 【参考方案1】:到目前为止,我已将 Microsoft Access 添加到服务器。 - 在系统数据源中添加了 32 位和 64 位驱动程序。 -
等一下!您添加了访问权限,但是什么版本?有 x32 位版本和 x64 位版本。因此,除非您愿意强制您的 Web 服务器以 x32 位运行,并运行 x32 IIS Web 服务器,否则您很可能想要安装 x64 位版本的访问。
-在系统数据源中添加了 32 位和 64 位驱动程序。
真的不可能。如果您安装了 x64 位访问,那么您将无法在 x32 odbc 配置(Windows)面板中选择 accDB 文件。您将始终能够使用 mdb 文件,因为 JET 数据引擎安装在所有 Windows 副本上(并且是仅 x32 位版本)。
因此,在您尝试建立连接之前,您需要确保已安装 x64 位版本的 access。完成后,您可以使用 oleDB 提供程序或 ODBC 提供程序。我非常强烈建议您使用 ODBC 提供程序,从那时起您可以更轻松地将连接翻转到 SQL 服务器或其他数据库,并且您的代码更改将是绝对最小的。 (编辑:我看到你在这里使用 ODBC - 所以我的坏,你的好!)
添加 x64 位版本的 Access 后,您应该能够连接到数据库。在您的开发机器上,您希望 VS 告诉 IIS 使用 x64 位,而当我们这样做时,您很可能应该在您的开发盒上启动并运行 x64 位访问。
【讨论】:
以上是关于System.Data.Odbc.OdbcException (0x80131937) 发布后,我无法使用 Odbc 功能读取、删除和写入访问 mdb 文件的主要内容,如果未能解决你的问题,请参考以下文章