Search code examples
c#compact-frameworkrefactoring

How would you refactor this bit of code?


This bit of code runs on Windows Compact Framework and what it does is obvious. It looks as it should be refactored (especially considering that I may want to add cmd.ExecuteResultSet() later), but I can't see an elegant way to do it. Any ideas appreciated.

internal void RunNonQuery(string query)
{
    string connString = GetLocalConnectionString();

    using (SqlCeConnection cn = new SqlCeConnection(connString))
    {
        cn.Open();
        SqlCeCommand cmd = cn.CreateCommand();
        cmd.CommandText = query;
        cmd.ExecuteNonQuery();
    }
}  

internal int RunScalar(string query)  
{
    string connString = GetLocalConnectionString();

    using (SqlCeConnection cn = new SqlCeConnection(connString))
    {
        cn.Open();
        SqlCeCommand cmd = cn.CreateCommand();
        cmd.CommandText = query;
        return int.Parse(cmd.ExecuteScalar().ToString());
    }
}

Solution

  • I'm not sure I would refactor it, but perhaps:

    static void PerformQuery(string connectionString, string command,
          Action<SqlCeCommand> action)
    { //TODO: sanity checks...
        using(SqlCeConnection conn = new SqlCeConnection(connectionString))
        using(SqlCeCommand cmd = conn.CreateCommand()) {
            cmd.CommandText = command;
            conn.Open();
            action(cmd);
        }
    }
    
    internal void RunNonQuery(string query)
    {
        string connString = GetLocalConnectionString();
        PerformQuery(connString, query, cmd => cmd.ExecuteNonQuery());
    }  
    
    internal int RunScalar(string query)  
    {
        int result = 0;
        string connString = GetLocalConnectionString();
        PerformQuery(connString, query,
            cmd => {result = int.Parse(cmd.ExecuteScalar().ToString()); }
        );
        return result;
    }
    

    Otherwise - just maybe a CreateAndOpenConnection(string) method, and a CreateCommand(SqlCeConnection,string) method.