System.Data.Odbc.OdbcException (0x80131937) 发布后我无法使用 Odbc 功能读取、删除和写入 access mdb 文件

System.Data.Odbc.OdbcException (0x80131937) After publishing I cannot use Odbc functionality to read, delete, and write into an access mdb file

无法连接 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 位驱动程序。 - 使用附加凭据编辑连接字符串。 -试过 ExtendedAnsiSQL=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) 在 System.Data.Odbc.OdbcConnectionHandle..ctor(OdbcConnection 连接,OdbcConnectionString constr,OdbcEnvironmentHandle environmentHandle)在 System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection,OdbcConnectionString connectionOptions)在 System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningObject)在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionOptions userOptions)在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 重试,DbConnectionOptions userOptions、DbConnectionInternal oldConnection、DbConnectionInternal& 连接) 在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() 在mocHub2.Controllers.AcctLegendDataController.GetData(字符串存储, DateTime date) in C:\Ang\Controllers\AcctLegendDataController.cs:line 330 at lambda_method(Closure , Object , Object[] ) at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,对象[]参数)在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext 上下文)在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next( State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope , 对象&状态, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.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 上下文)在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext 上下文)

So far I have -added Microsoft Access to the server. -added 32-bit and 64-bit Drivers in System Data Sources. -

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

-added 32-bit and 64-bit Drivers in System Data Sources.

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

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

添加 x64 位版本的 Access 后,您应该能够连接到数据库。在你的开发机器上,然后你想从 VS 告诉 IIS 使用 x64 位,当我们在这里时,你很可能应该在你的开发箱上获得 x64 位访问和 运行ning。