[英]Access multiple databases from winforms without adding datasource
我正在 VS C# 中创建一个测试应用程序,以允许生产在数据库中搜索产品信息并创建 csv 文件。 该应用程序目前与 1 AccessDB 一起使用,我在 IDE Data tab
中添加了它作为数据源。
有大约 50 个产品数据库,必须在数据源选项卡中添加每个产品数据库是不可行的,特别是如果以后创建了新数据库。
我希望像下面这样的东西可以将databasePath
作为参数传递。
databasePath = txtBox.Text;
OleDbConnection conn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=databasePath");
是否可以在不必将 go 到 IDE 并添加新数据源的情况下执行此操作?
如果所有数据库都具有完全相同的表和列,并且您正在使用 TableAdapter,请尝试以下操作。
警告在加载表单后更改连接字符串时,以下内容似乎不起作用。 如果您要在主窗体中更改它而不是打开子窗体,则连接字符串有效,但在以与 TableAdapter 相同的形式更改连接字符串时无效。 最好的猜测是在表单初始化时设置了连接字符串,因此看不到更改的连接字符串。
用法
var source = Path.Combine(ConnectionHelper.BasePath, "Database1.accdb");
ConnectionHelper.ChangeConnection(source,2);
更改BasePath
以匹配您的数据库路径。
using System.Configuration;
using System.Data.OleDb;
using System.IO;
using static System.Configuration.ConfigurationManager;
namespace AccessMultiConnections.Classes
{
public class ConnectionHelper
{
/// <summary>
/// Location of all databases
/// </summary>
public static string BasePath =
"C:\\Dotnetland\\Databases";
/// <summary>
/// Change database connection by index in connection string section
/// </summary>
/// <param name="source">Path and database name</param>
/// <param name="index">ordinal index of connection string</param>
/// <remarks>
/// Can change index parameter to a string name representing the connection
/// string if desire.
/// </remarks>
public static void ChangeConnection(string source, int index)
{
var config = OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config
.GetSection("connectionStrings");
// in this case the index to the connection string is 2
var current = connectionStringsSection.ConnectionStrings[index]
.ConnectionString;
var builder = new OleDbConnectionStringBuilder(current)
{
DataSource = source
};
connectionStringsSection.ConnectionStrings[index].ConnectionString =
builder.ConnectionString;
config.Save();
RefreshSection("connectionStrings");
Properties.Settings.Default.Reload();
}
/// <summary>
/// Provides the current database name without a path in appsettings.config
/// </summary>
/// <returns>File name for current connection</returns>
public static string CurrentConnectionString()
{
var config = OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config
.GetSection("connectionStrings");
var builder =
new OleDbConnectionStringBuilder(
connectionStringsSection.ConnectionStrings[2]
.ConnectionString);
return Path.GetFileName(builder.DataSource);
}
}
}
编辑- 注意到我在CurrentConnectionString
中硬编码了连接字符串,这是正确的代码。
/// <summary>
/// Provides the current database name without a path in appsettings.config
/// </summary>
/// <param name="index">ordinal index of connection string</param>
/// <returns>File name for current connection</returns>
public static string CurrentConnectionString(int index = 2)
{
var config = OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config
.GetSection("connectionStrings");
var builder =
new OleDbConnectionStringBuilder(
connectionStringsSection.ConnectionStrings[index]
.ConnectionString);
return Path.GetFileName(builder.DataSource);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.