替换SqlConnection和SqlCommand

时间:2014-09-16 19:20:23

标签: c# .net asp.net-mvc tsql ado.net

我一直在编写很多openclose连接到Microsoft SQL Server数据库。我不确定它是否是适用于.NET的最新技术。我有没有最新的.NET功能?

示例代码:

protected string InjectUpdateToProductDBString(string Command, TextBox Data, string TBColumn)
{
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["AuthenticationDBConnectionString"].ConnectionString;

        SqlConnection con = new SqlConnection(connectionString);
        con.Open();

        SqlCommand cmd = new SqlCommand(command, con);
        cmd.Parameters.AddWithValue("@" + TBColumn, Data.Text.ToString());

        cmd.ExecuteNonQuery();

        con.Close();

        return "Data successfully updated";
    }

这种繁琐的代码技术有没有替代品?只是讨论改进我的代码技术。

3 个答案:

答案 0 :(得分:1)

还有其他方法可以编写它和您可以使用的其他工具(如实体框架)。

但是,我建议您为数据访问调用创建一个静态函数(或多个)。

  protected DataTable ExecuteSqlDataReader(string connection, string sqlQuery, SqlParameter[] cmdParams)
  {

     MySqlConnection con = new MySqlConnection(connection);
     MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
     cmd.Parameters = cmdParams;
     MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
     DataTable dt = new DataTable();
     sda.Fill(dt);
     sda.Command.Close();
     return dt;

  }

创建获取dataTable,One值,ExecuteNonQuery的方法,甚至通过将SqlCommand创建抽象给它自己的方法来进一步打破它。

在任何项目中,此代码只能写几次。

答案 1 :(得分:0)

private SqlConnection GetConnection()
{
    var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["AuthenticationDBConnectionString"].ConnectionString);
    con.Open();
    return con;
}

protected string InjectUpdateToProductDBString(string Command, TextBox Data, string TBColumn)
{
    using (var con = GetConnection())
    {
        using (var cmd = con.CreateCommand())
        {
            cmd.Parameters.AddWithValue("@" + TBColumn, Data.Text);
            cmd.ExecuteNonQuery();
            return "Data Succesfully Updated";
        }
    }
}

答案 2 :(得分:0)

请务必将SqlConnection括在using声明中。即使存在异常,它也将确保连接关闭。另外,将SqlCommand对象括在using语句中,这将确保处理非托管资源。

在当前的代码段中,如果cmd.ExecuteNonQuery();出现异常,则您的行con.Close将无法执行,保持连接处于打开状态。

所以你的方法可能就像:

protected string InjectUpdateToProductDBString(string Command, TextBox Data, string TBColumn)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["AuthenticationDBConnectionString"].ConnectionString;
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand(command, con))
        {
            cmd.Parameters.AddWithValue("@" + TBColumn, Data.Text.ToString());
            cmd.ExecuteNonQuery();
        }
    }
    return "Data successfully updated";
}

稍后,您可以为查询中返回的行返回DataTableList<T>

如果您想远离ADO.Net,那么您可以查看Object-Relation Mapping (ORM),它将根据您的数据库提供对象,并提供更简单的方法来管理您的代码库。 Entity framework就是其中之一。您可能会看到https://stackoverflow.com/questions/132676/which-orm-for-net-would-you-recommend