繁体   English   中英

从winforms访问多个数据库而不添加数据源

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM