我的Windows窗体应用程序使用在Visual Studio中使用设计器创建的强类型数据集。在运行时,我希望能够选择实时或测试数据库。
在运行时以编程方式为数据集设置连接字符串的最佳方法是什么?
答案 0 :(得分:3)
TableAdapters中的连接属性定义为内部。
internal global::System.Data.SqlClient.SqlConnection Connection
所以万一你的TypedDataset不在 与主窗口相同的组件 表单应用程序,你将无法做到 访问Connection属性。这个 当你以后问题可能会弹出 重构您的数据集代码并移动它 进入一个单独的项目 制作自己的独立组件。
要解决此问题,您可以按照以下说明进行操作。
为TableAdapter创建部分类,并在默认的public parameterless构造函数旁边添加另一个构造函数。假设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.(connection);
答案 1 :(得分:1)
在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或与任何其他开关一起使用将为您提供测试配置。
答案 2 :(得分:1)
Re:wethercotes评论
向导在设置数据集时存储连接字符串,但这并不意味着您无法使其动态化。具体取决于您使用的是哪个版本,但通常如果展开数据集下的文件,您将找到类似Designer.cs或DataTableNameAdapter.xsd的文件。您可以打开这些文件并搜索_connection。这通常是一个私有变量,并在类中的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;
}
}
请注意,如果重新生成数据集,则可能会丢失此部分代码,如果不重构数据集,则可能需要将其添加到多个对象中。
答案 3 :(得分:1)
默认情况下,Connection
属性设置为internal
。可以在数据集的设计器中对此进行更改。
ConnectionModifier
属性更改为public
。Connection
属性。var loginsTableAdapter = new MyDataSetTableAdapters.LoginsTableAdapter();
loginsTableAdapter.Connection.ConnectionString = _myConnectionString;
答案 4 :(得分:0)
使用TableAdapterManager可能对您有用。请在以下网址阅读更多信息:http://rajmsdn.wordpress.com/2009/12/09/strongly-typed-dataset-connection-string/
答案 5 :(得分:0)
到目前为止我找到的最佳解决方案:
添加另一个程序设置,该设置保存客户端在运行时设置的优先连接字符串(例如newConnectionString)
然后才使用表适配器:
this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString;
答案 6 :(得分:0)
编辑设计器文件很痛苦。
我在“User”下创建了一个名为'ConnectionString'的设置条目,这使得Visual Studio在添加强类型数据集时会创建一个应用程序字符串'Connection String1'。
因此,我只是在数据集设计器文件中用'ConnectionString'替换所有'ConnectionString1',这将允许您使用'User'字符串设置在运行时加载连接字符串。
恕我直言,这是一个允许用户在运行时修改连接字符串的缺点。 (有人在雷德蒙德听吗?)