添加子例程以处理 C# WPF 中的连接字符串的正确方法是什么

What is the proper way to add subroutine to handle the connection string in C# WPF

我有一个 app.config 和一个完美运行的连接字符串。

App.config

  <connectionStrings>
    <add name="MyConnectionString"
         connectionString="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=myDatabaseC;Data Source=agent_edx44-PC;"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>

我的表格

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;         
    con.Open();
    SqlCommand cmd = new SqlCommand("uspINSERT",con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
    .....some code
}

private void bindDataGrid()
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    con.Open();
    SqlCommand cmd = new SqlCommand("uspSELECTALL",con);
    cmd.Connection = con;
   ...some code

}

我的问题是我想将这行代码放在一个子例程中,以便我可以在任何方法中调用它。

SqlConnection con = new SqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

这是我到目前为止所做的:

private void MyConnection()
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
    MyConnection()
    con.Open();
    SqlCommand cmd = new SqlCommand("uspINSERT",con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
    .....some code
}

但是它有一个错误说:

The name 'con' does not exist in the current context

将您的 MyConnection 方法更改为此,它 returns 一个 SqlConnection:

private SqlConnection MyConnection()
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    return con;
}

这是使用方法:

using (var con = MyConnection()) 
{
   //your code
}

using 块将在您完成后处理您的数据库连接。

前两个方法的编写方式如下:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        con.Open();
        using (SqlCommand cmd = new SqlCommand("uspINSERT", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
            //.....some code
        }
    }
}

private void bindDataGrid()
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        con.Open();
        using (SqlCommand cmd = new SqlCommand("uspSELECTALL", con))
        {
            cmd.Connection = con;
            //...some code
        }
    }
}

现在,要让您的新代码正常工作,您需要 return 来自 MyConnection 方法的连接:

private SqlConnection MyConnection()
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    return con;
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    using (SqlConnection con = MyConnection())
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("uspINSERT", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
            //.....some code
        }
    }
}

现在,我要更进一步,这样做:

private void RunSqlCommand(string cmdText, Action<SqlConnection, SqlCommand> execute)
{
    using (SqlConnection con = new SqlConnection())
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        con.Open();
        using (SqlCommand cmd = new SqlCommand(cmdText, con))
        {
            cmd.Connection = con;
            execute(con, cmd);
        }
    }
}

现在你的btnSave_Click方法可以变成这样:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    RunSqlCommand("uspINSERT", (con, cmd) =>
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
        //.....some code
    });
}