.net SQL Server存储过程包装器类结构

che*_*525 0 .net c# sqlconnection

我正在寻找一个C#SQL Server包装器来调用一些存储过程.如果我正在写一个函数,我会做类似下面的事情(我认为是正确的/正确的):

void RunStoredProc1(object arg1)
{
  using(SqlConnection conn = new SqlConnection(connStr)){
    try{
      SqlCommand cmd = new SqlCommand("storedProc1", conn);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("@input1", arg1);

      conn.Open();
      cmd.ExecuteNonQuery();
    } catch (Exception ex){
      //handle the exception appropriately.
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是它似乎有很多重复的代码......每个函数都有相同的using/try(打开/执行)/ catch代码,而且只需要一个就可以了地点.这样做有干净的方法吗?对于我想要使用数据读取器的查询怎么样?

Tho*_*rin 5

这样的事情应该做:

void RunStoredProc(string storedProcName, IDictionary<string, object> args)
{
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = storedProcName;
        cmd.CommandType = CommandType.StoredProcedure;

        foreach (KeyValuePair<string, object> kvp in args)
        {
            cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
        }

        conn.Open();
        cmd.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

作为这个辅助方法的参数,连接对象本身可能也会更好,所以你可以做到static.将它作为扩展方法编写可能会很有趣SqlConnection.

我会在你的RunStoredProc1方法中保留异常处理,甚至更可能:在调用的方法中RunStoredProc1,因为异常处理可能会因具体情况而异.

void RunStoredProc1(object input1)
{
    var args = new Dictionary<string, object>()
               {
                   { "input1", input1 }
               };

    try
    {
        RunStoredProc("storedProc1", args);
    }
    catch (Exception ex)
    {
        // Handle exception properly
    }
}
Run Code Online (Sandbox Code Playgroud)