我有一个Windows窗体应用程序。我想为此应用程序创建一个安装文件。我使用的是Visual Studio 2012和SQL Server 12。
我希望此设置适用于所有新环境。
那么,如何使这个连接字符串动态化?我可以在安装后创建连接字符串,并使其可供每个表单访问,例如在我的本地计算机中吗?
任何类型的源代码,视频链接,解释或示例对我都有很大的帮助。
答案 0 :(得分:1)
我建议在机器上搜索SQL服务器的实例,然后在每个实例中搜索数据库。您可以设置一些逻辑,例如,如果只找到一个实例,并且在此实例上只存在具有特定名称的数据库,则使用此数据库,但如果找到两个或更多实例,或者找到不同的数据库名称,则显示窗口到用户可以选择合适的用户。
要查找数据库实例,您可以使用以下方法:
private static DataRowCollection SQLDataServers()
{
System.Data.Sql.SqlDataSourceEnumerator instance = System.Data.Sql.SqlDataSourceEnumerator.Instance;
DataTable dt = instance.GetDataSources();
if (dt.Rows.Count>0)
{
return dt.Rows;
}
throw new Exception("No SQL Instance Found");
}
要在数据库中查找表,您可以使用以下方法:
private static List<string> GetDatabases(string conString)
{
List<string> list = new List<string>();
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
using (SqlCommand cmd = new SqlCommand("SELECT name from sys.databases", con))
{
using (IDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
list.Add(dr[0].ToString());
}
}
}
}
return list;
}
要生成连接字符串,您可以使用nuget package或以下方法:
public static string GetSqlDataSourceConnectionString(string dataSource)
{
return GetSQLDataSource(dataSource).ToString();
}
private static SqlConnectionStringBuilder GetSQLDataSource(string dataSource)
{
var r = GetDataSource(dataSource).AddIntegratedSecurity();
return r;
}
private static SqlConnectionStringBuilder GetDataSource(string dataSource)
{
SqlConnectionStringBuilder sqlBuilder = new
SqlConnectionStringBuilder();
sqlBuilder.DataSource = dataSource;
return sqlBuilder;
}
private static SqlConnectionStringBuilder AddIntegratedSecurity(this SqlConnectionStringBuilder connectionStringBuilder)
{
connectionStringBuilder.IntegratedSecurity = true;
return connectionStringBuilder;
}
连接所有这些元素的方法如下:
static void Main(string[] args)
{
var servers=SQLDataServers();
foreach (DataRow item in servers)
{
string serverName = string.Format($"{item.ItemArray[0].ToString()}\\{item.ItemArray[1].ToString()}");
var connectionString = GetSqlDataSourceConnectionString(serverName);
var listOfDB=GetDatabases(connectionString);
}
}