首页 > 解决方案 > System.Data.Odbc.OdbcException (0x80131937) 发布后,我无法使用 Odbc 功能读取、删除和写入访问 mdb 文件

问题描述

无法连接 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 : 错误的, …}

所以我觉得我有点到了某个地方,因为没有 odbc 错误。只是一个错误,说我的网关不好。

有谁知道接下来的步骤是什么?

这是没有 64 位 Microsoft Access 驱动程序的错误。

System.Data.Odbc.OdbcException (0x80131937) 在 System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection connection, OdbcConnectionString constr, OdbcEnvironmentHandle environmentHandle) 在 System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection, OdbcConnectionString connectionOptions) 在System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions) 在 System.Data. ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试, DbConnectionOptions userOptions,DbConnectionInternal oldConnection, DbConnectionInternal& connection) 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data .Odbc.OdbcConnection.Open() at mocHub2.Controllers.AcctLegendDataController.GetData(String stores, DateTime date) in C:\Ang\Controllers\AcctLegendDataController.cs:line 330 at lambda_method(Closure , Object , Object[] ) at Microsoft Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor 上的 .Extensions.Internal.ObjectMethodExecutor.Execute(对象目标,对象 [] 参数)。在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() 在 Microsoft.AspNetCore.Mvc 执行(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,Object[] 参数) .Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext 上下文) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker。Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Routing.EndpointMiddleware 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 在 Microsoft.AspNetCore.Routing.EndpointMiddleware 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() .Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft .AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext 上下文)Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware。调用(HttpContext 上下文)Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware。调用(HttpContext 上下文)AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke( HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext 上下文)AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke( HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext 上下文)

标签: ms-accessasp.net-core-mvcodbcdriver

解决方案


到目前为止,我已将 Microsoft Access 添加到服务器。- 在系统数据源中添加了 32 位和 64 位驱动程序。-

坚持,稍等!您添加了访问权限,但是什么版本?有 x32 位版本和 x64 位版本。因此,除非您愿意强制您的 web 服务器以 x32 位运行,并运行 x32 IIS web 服务器,否则您很可能想要安装 x64 位版本的访问。

- 在系统数据源中添加了 32 位和 64 位驱动程序。

真的不可能。如果您安装了 x64 位访问,那么您将无法在 x32 odbc 配置(Windows)面板中选择 accDB 文件。您将始终能够使用 mdb 文件,因为 JET 数据引擎安装在所有 Windows 副本上(并且是仅 x32 位版本)。

因此,在您尝试建立连接之前,您需要确保安装了 x64 位版本的访问权限。完成后,您可以使用 oleDB 提供程序或 ODBC 提供程序。我非常强烈建议您使用 ODBC 提供程序,从那时起您可以更轻松地将连接翻转到 SQL 服务器或其他数据库,并且您的代码更改将是绝对最小的。(编辑:我看到你在这里使用 ODBC - 所以我的坏,你的好!)

添加 x64 位版本的 Access 后,您应该能够连接到数据库。在您的开发机器上,您希望 VS 告诉 IIS 使用 x64 位,而当我们这样做时,您很可能应该在您的开发盒上启动并运行 x64 位访问。


推荐阅读