C# 程序不会在其他计算机上启动。 OleDB 命令中的错误

Posted

技术标签:

【中文标题】C# 程序不会在其他计算机上启动。 OleDB 命令中的错误【英文标题】:C# Program wont start on other computers. Error in OleDB commands 【发布时间】:2018-08-01 11:50:04 【问题描述】:

我是编码世界的新手,因此这可能是一件愚蠢的事情。 我编写了一个软件,它将文件复制到本地磁盘并运行特定的 CMD 命令。路径存储在内部服务器上的数据库中。在我的电脑上一切正常。发布版本和安装程序等。

(即使程序做了它应该做的事情,我也很震惊......)

但是当我在另一台计算机上使用该设置时,它不会运行。我可以看到它正在工作,我查看了事件日志并找到了这个:

应用程序:EAC600Programing.exe

框架版本:v4.0.30319

说明:进程因未处理的异常而终止。

异常信息:System.InvalidOperationException

在 System.Data.OleDb.OleDbServicesWrapper.GetDataSource(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.DataSourceWrapper ByRef)

在 System.Data.OleDb.OleDbConnectionInternal..ctor(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.OleDbConnection)

在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(System.Data.Common.DbConnectionOptions, System.Data.Common.DbConnectionPoolKey, System.Object, System.Data.ProviderBase.DbConnectionPool, System.Data.Common.DbConnection)

在 System.Data.ProviderBase.DbConnectionFactory.CreateConnection(System.Data.Common.DbConnectionOptions, System.Data.Common.DbConnectionPoolKey, System.Object, System.Data.ProviderBase.DbConnectionPool, System.Data.Common.DbConnection, System.Data.Common.DbConnectionOptions)

在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionPoolGroup, System.Data.Common.DbConnectionOptions)

在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(System.Data.Common.DbConnection, System.Threading.Tasks.TaskCompletionSource`1, System.Data.Common.DbConnectionOptions, System.Data.ProviderBase.DbConnectionInternal, System. Data.ProviderBase.DbConnectionInternal ByRef)

在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory, System.Threading.Tasks.TaskCompletionSource`1, System.Data.Common.DbConnectionOptions)

在 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory, System.Threading.Tasks.TaskCompletionSource`1, System.Data.Common.DbConnectionOptions)

在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory)

在 System.Data.OleDb.OleDbConnection.Open()

在 Session.Broker.GetVersionFromDB(System.String)

在 EAC600Programing.Main.Fill()

在 EAC600Programing.Main..ctor()

在 EAC600Programing.Program.Main()

Main.Fill 是我用数据库中的数据填充组合框的函数。它再次使用了几个连接到数据库并获取数据的函数(在 youtube 上看到并在 *** 中阅读了它们)。 (经纪人被分成自己的类文件)我目前没有能力解决这个问题,所以如果有人可以提供帮助,那就太好了。 PS。已经检查过是否相同的 .Net 版本。他们是一样的。 (大型公司电脑网络,所以所有电脑都一样。)是的,电脑和用户都可以完全访问网络。

Broker b = new Broker();
    private void Fill()
    
        combo_BootCOC.DataSource = b.GetVersionFromDB("BootCOC");
        combo_BootBMS.DataSource = b.GetVersionFromDB("BootBMS");
        combo_BootMCS.DataSource = b.GetVersionFromDB("BootMCS");
        combo_MainCOC.DataSource = b.GetVersionFromDB("MainCOC");
        combo_MainBMS.DataSource = b.GetVersionFromDB("MainBMS");
        if (cb_Compact.Checked)
        
            combo_MainMCS.DataSource = b.GetVersionFromDB("MainMCSCompact");
        
        else
        
            combo_MainMCS.DataSource = b.GetVersionFromDB("MainMCS");
        

    

    public class Broker

    OleDbConnection connection;
    OleDbCommand command;

    private void ConnectTo()
    
        connection = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = N:\Release\Electric Solution\1 Production\03 Tools\05 EAC600 Programming\DataBase.accdb");
        try
        
            command = connection.CreateCommand();
        
        catch (Exception)
        

            throw;
        
    

    public Broker()
    
        ConnectTo();
    

       public List<double> GetVersionFromDB(string db)
    
        List<double> versionList = new List<double>();
        try
        
            command.CommandText = "SELECT * FROM " + db;
            command.CommandType = CommandType.Text;
            connection.Open();

            OleDbDataReader reader = command.ExecuteReader();

            while (reader.Read())
            
                double v;
                v = Convert.ToDouble(reader["swVersion"]);

                versionList.Add(v);
            
            return versionList;
        
        catch (Exception)
        

            throw;
        
        finally
        
            if (connection != null)
            
                connection.Close();
            
        
    

编辑1:

Soooo,我通过安装 Access 2010 解决了第一个问题,并以这个问题结束:

应用程序:EAC600Programing.exe

框架版本:v4.0.30319

说明:进程因未处理的异常而终止。

异常信息:System.FormatException

在 System.Number.ParseDouble(System.String, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo)

在 System.String.System.IConvertible.ToDouble(System.IFormatProvider)

在 System.Convert.ToDouble(System.Object)

在 Session.Broker.GetVersionFromDB(System.String)

在 EAC600Programing.Main.Fill()

在 EAC600Programing.Main..ctor()

在 EAC600Programing.Program.Main()

所以回去看看我做错了什么。

【问题讨论】:

另一台计算机可能没有设置所需的驱动程序和/或 oledb。将您的 OLEDB 设置从您的计算机复制到目标计算机上 Alos 检查您是否可以像使用映射驱动器一样访问数据源 我遇到了与 OleDb 类似的问题,它只是机器上缺少/旧的 dll。 OleDb 依赖于一系列与 C++ 可再发行组件捆绑在一起的 dll,您可以从微软网站上下载。它们还附带几个其他可分发包,包括 Microsoft Access Database Engine Redistributable。我会从那里开始。 所以,重新安装了新的 SQL/OleDB 驱动程序,结果相同,事件日志相同。将重新启动并重试。检查数据访问。来自其他用户的完全读取权限。我的完全写入权限。我只是一个会写新途径的人。 C++ 发行版....嗯,接下来要检查一下。感谢您的反馈。 连接字符串中的路径对该服务器有效? 【参考方案1】:

使您的应用程序可以在任何具有数据库连接的设备上运行。

1- 您的应用程序在其上运行的设备应包含数据库。

2- 您的应用程序应该在正确的路径中查找 DB。

解决这个问题:

-将连接字符串移动到app.config,如下

<configuration>
  <connectionStrings>
    <add name="ConnectionStringName" Provider = "Microsoft.ACE.OLEDB.12.0"; Data Source = "path_to_yourDB\DataBase.accdb"/>
  </connectionStrings>
</configuration> 

- 从您的代码中调用该连接字符串,如下所示

var connectionString=ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;

如果您想将应用程序移动到另一台计算机,请在 app.config 中写入新路径,而不是旧路径。


解决方案 2: 您可以使用相对路径作为以下链接说明:

connection string with relative path to the database file

【讨论】:

【参考方案2】:

我想通了谢谢你们。 这是一个小部门 SW,最多 10 个人将使用,所以没什么大不了的。

我只需要 Microsoft Office Access 2010,这里的所有员工都可以访问。 第二个问题是一个错误,我将 a 转换为 double ,它是一个需要成为字符串的字符串。 (我之前忽略了这一点)。

我会在未来寻找更好的解决方案,但目前它在我和其他 3 台计算机以及其他 3 台具有不同用户帐户权限的用户上运行良好。

所以我高兴极了。谢谢大家的帮助和提示。期待帮助(如果可以的话)并得到你的帮助。

【讨论】:

【参考方案3】:

您的程序需要运行时。运行时必须包含计算机运行软件所需的所有设置文件。在这种情况下,我认为您需要在运行时中包含:

    微软 .NET 框架 4

    https://www.microsoft.com/en-us/download/details.aspx?id=17851

    用于 Visual FoxPro 9.0 的 Microsoft OLE DB 提供程序

    https://www.microsoft.com/en-us/download/details.aspx?id=14839

我向您保证,当您在新计算机上安装这些应用程序时,您的应用程序将正常运行。

【讨论】:

以上是关于C# 程序不会在其他计算机上启动。 OleDB 命令中的错误的主要内容,如果未能解决你的问题,请参考以下文章

win10:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序

System.Exception:“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册 [重复]

本地计算机上的SQL Server(MSSQLSERVER)服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止

win7(64)未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序

C#下载了一个小access程式,打是时提示未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"

关于C#联接数据库是出现'未在本地计算机上注册'错误的解决办法