Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时设置强类型数据集连接字符串的最佳方法?_C#_Visual Studio_Ado.net - Fatal编程技术网

C# 在运行时设置强类型数据集连接字符串的最佳方法?

C# 在运行时设置强类型数据集连接字符串的最佳方法?,c#,visual-studio,ado.net,C#,Visual Studio,Ado.net,我的Windows窗体应用程序使用在Visual Studio中使用设计器创建的强类型数据集。在运行时,我希望能够选择实时或测试数据库 在运行时以编程方式为数据集设置连接字符串的最佳方法是什么?将它们的连接字符串都存储在app.config中,然后您可以基于命令行/启动开关进行切换。或者,如果您想给用户提供灵活性,您可以给他们一个选项页面,让他们可以选择要使用的连接 以下是读取启动开关的代码: string[] args = Environment.GetCommandLineArgs(); /

我的Windows窗体应用程序使用在Visual Studio中使用设计器创建的强类型数据集。在运行时,我希望能够选择实时或测试数据库


在运行时以编程方式为数据集设置连接字符串的最佳方法是什么?

将它们的连接字符串都存储在app.config中,然后您可以基于命令行/启动开关进行切换。或者,如果您想给用户提供灵活性,您可以给他们一个选项页面,让他们可以选择要使用的连接

以下是读取启动开关的代码:

string[] args = Environment.GetCommandLineArgs();
// The first (0 index) commandline argument is the exe path.
if (args.Length > 1)
{
    if (Array.IndexOf(args, "/live") != -1)
    {
        // connection string = 
        // ConfigurationSettings.AppSettings["LiveConString"];
    }
}
else
{
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"];
}
因此,现在您可以通过以下方式启动应用程序:

MyApp.exe /live

单独使用MyApp.exe或与任何其他开关一起使用将获得测试配置。

Re:wethercotes comment

当您设置数据集时,向导将存储连接字符串,但这并不意味着您不能使其成为动态的。方式取决于您使用的版本,但一般来说,如果展开数据集下的文件,您会发现类似Designer.cs或DataTableNameAdapter.xsd的文件。您可以打开这些文件并搜索\u连接。这通常是一个私有变量,在类的init函数中设置

通过添加如下代码,可以使设置动态:

public string ConnectionString
{
    get { return this._connection.ConnectionString; }
    set
    {
        if (this._connection == null)
        {
            this._connection = new System.Data.SqlClient.SqlConnection();
        }
        this._connection.ConnectionString = value;
    }
}

请注意,如果重新生成数据集,可能会丢失这部分代码,如果不重构数据集,可能需要将其添加到多个对象。

使用TableAdapterManager可能适合您。请阅读更多内容:

我迄今为止找到的最佳解决方案:

添加另一个程序设置,该设置保存客户端在运行时设置的首选连接字符串(例如newConnectionString)

然后,在使用表格适配器之前:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString;

TableAdapters中的连接属性定义为内部

internal global::System.Data.SqlClient.SqlConnection Connection
因此,如果您的TypedDataset不在 与主窗口相同的程序集 表单应用程序,您将无法 访问连接属性。这 问题可能会在您稍后访问时弹出 重构数据集代码并移动它 进入一个单独的项目,该项目将 生产自己的独立组件

要解决此问题,您可以执行以下操作

为TableAdapter创建分部类,并在默认的公共无参数构造函数旁边添加另一个构造函数。假设TableAdapter类型为MyTableAdapter

public partial class MyTableAdapter
{
    public MyTableAdapter(SqlConnection connection)
    {
        thisSetConnection(connection);
        this.ClearBeforeFill = true;
    }

    public void SetConnection(SqlConnection connection)
    {
        this._connection = connection;
    }
}
您将需要对项目中的TableAdapter执行此操作。TableAdapter没有任何公共基类,但由于它们被声明为分部类,所以我们可以用上面提到的方法来实现

现在在运行时,您可以像这样创建TableAdapter的实例

SqlConnection connection;
//create the connection here at runtime..
MyTableAdapter adapter = new MyTableAdapter(connection);
或者甚至可以在稍后使用默认的无参数公共构造函数创建TableAdapter实例后分配它

SqlConnection connection;
//create the connection here at runtime..
MyTableAdapter adapter = new MyTableAdapter();
adapter.SetConnection(connection);

编辑设计器文件很痛苦

我在“User”下创建了一个名为“ConnectionString”的设置条目,它使Visual Studio在添加强类型数据集时创建一个应用程序字符串“Connection String1”

因此,我只是将dataset designer文件中的所有“ConnectionString”替换为“ConnectionString”,这将允许您在运行时使用“User”字符串设置来加载连接字符串


允许用户在运行时修改连接字符串是一个缺点。(是否有人在Redmond中侦听?

默认情况下,
连接
属性设置为。这可以在数据集的设计器中更改

  • 右键单击TableAdapter
  • 然后将
    ConnectionModifier
    属性更改为
    public
  • 现在,您可以访问项目中的
    连接
    属性

  • 感谢您的回答,但我的问题是如何在运行时设置强类型数据集的连接字符串。再次感谢Gary。我已经创建了一个包含您的代码的分部类,在重新生成数据集时防止丢失。不幸的是,这必须为每个数据适配器完成,我有几十个。不,您不能这样做这样做。TableAdapters中的Connection属性定义为internal。从VS2010开始,可以指定连接的可见性(例如public),并且可以指定生成的DataTableAdapters的基类…(也就是说,本文主要与VS2008和以前的问题相关:-)
    var loginsTableAdapter = new MyDataSetTableAdapters.LoginsTableAdapter();
    loginsTableAdapter.Connection.ConnectionString = _myConnectionString;