Search code examples
c#.netsqlconnection

.net SQL Server stored procs wrapper class structure


I'm looking to write a C# SQL Server wrapper to call some stored procedures. If I was writing a single function I'd do something like the following (which I think is correct/proper):

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.
    }
  }
}

The problem I'm having is that it seems like a lot of repeated code... every function will have the same using/try(open/execute)/catch code, and it'd be nice to have it all in only one place. Is there a clean way of doing this? How about for queries that I'd want to use a data reader on?


Solution

  • Something like this should do:

    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();
        }
    }
    

    The connection object itself would probably also be better off as a parameter to this helper method, so you could make it static. It might be interesting to write it as an extension method on SqlConnection.

    I would keep the exception handling in your RunStoredProc1 method or even more likely: in the methods that call RunStoredProc1, because exception handling will likely differ on a case by case basis.

    void RunStoredProc1(object input1)
    {
        var args = new Dictionary<string, object>()
                   {
                       { "input1", input1 }
                   };
    
        try
        {
            RunStoredProc("storedProc1", args);
        }
        catch (Exception ex)
        {
            // Handle exception properly
        }
    }