ServiceStack OrmLite Command Timeout

2019-06-20 06:44发布

问题:

When using IDbConnection.ExecuteSql how do I set the Command Timeout?

IDbConnection db = ConnectionFactory.OpenDbConnection();
db.ExecuteSql("...");

If I use the IDbCommand.ExecuteSql ( See below ) method I can set the Command Timeout, but I get a bunch of warnings about deprecated methods.

IDbCommand comm = db.CreateCommand()
comm.CommandTimeout = 240;                    
comm.ExecuteSql("...");

回答1:

With the most recent change OrmLite no longer provides APIs around the IDbCommand object directly (which have now all been made internal in the latest version).

But since OrmLite is only extension methods over ADO.NET's underlying IDbConnection and IDbCommand interfaces, you can easily by-pass OrmLite's extension methods when you need to and just use them directly, e.g:

IDbConnection db = ConnectionFactory.OpenDbConnection();
IDbCommand cmd = db.CreateCommand();
cmd.CommandTimeout = 240;  
cmd.CommandText = "...";
cmd.ExecuteNonQuery();

Alternatively you can set a global CommandTimeout with:

OrmLiteConfig.CommandTimeout = 240;


回答2:

A bit late to the party and as you've seen in my comment, I've had this exact issue. My solution was to extend on myth's suggestion and create a new extension method:

public static partial class IDbConnectionExtensionMethods
{
    public static List<T> Query<T>(this IDbConnection self, string sql, int commandTimeout)
    {
        List<T> results = null;
        self.Exec((dbCmd) =>
            {
                dbCmd.CommandTimeout = commandTimeout;
                dbCmd.CommandText = sql;
                using (var reader = dbCmd.ExecuteReader())
                {
                    results = reader.ConvertToList<T>();
                }
            });

        return results;
    }   // eo Query<T>
}   // eo class IDbConnectionExtensionMethods