安装期间创建连接字符串

时间:2016-11-10 11:43:10

标签: vb.net

我有一个Windows窗体应用程序。我想为此应用程序创建一个安装文件。我使用的是Visual Studio 2012和SQL Server 12。

我希望此设置适用于所有新环境。

那么,如何使这个连接字符串动态化?我可以在安装后创建连接字符串,并使其可供每个表单访问,例如在我的本地计算机中吗?

任何类型的源代码,视频链接,解释或示例对我都有很大的帮助。

1 个答案:

答案 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);
     }
}