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 提供程序