Rod*_*ins 4 c# sql entity-framework
对于具有许多记录的查询,我有超时问题.如何更改查询超时?
我尝试以这种方式更改超时连接,但它不起作用:
connection.ConnectionTimeout = 60; //不工作(准备好了)
类:
public abstract class RepositoryBase<TEntity> : IRepositoryBase<TEntity>, IDisposable where TEntity : class
{
protected SqlConnection _connection;
protected string _connectionString;
public RepositoryBase(string connectionString)
{
_connectionString = connectionString;
SqlConnection connection = new SqlConnection(connectionString);
if (connection.State == ConnectionState.Closed)
connection.ConnectionTimeout = 60; // not working (ready)
connection.Open();
_connection = connection;
}
public List<T> GetEntitiesByQuery<T>(string Query)
{
using (var connection = _connection)
{
try
{
var entities = connection.Query<T>(Query);
return entities.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
connection.Close();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要设置CommandTimeout
属性:
等待命令执行的时间(以秒为单位).默认值为30秒.
如何设置取决于所使用的数据访问技术.
对于普通的ADO.NET:
IDbCommand cmd = ...;
cmd.CommandTimeout = 120; // 2 min
Run Code Online (Sandbox Code Playgroud)
对于EF6:
DbContext db = ...;
db.Database.CommandTimeout = 120; // 2 min
Run Code Online (Sandbox Code Playgroud)
但看起来你正在使用Dapper.使用的Query<T>
方法目前有以下签名:
public static IEnumerable<T> Query<T>(
this IDbConnection cnn,
string sql,
object param = null,
IDbTransaction transaction = null,
bool buffered = true,
int? commandTimeout = null,
CommandType? commandType = null
)
Run Code Online (Sandbox Code Playgroud)
如您所见,有许多可选参数,其中一个是commandTimeout
您需要的.所以你可以使用这样的东西:
var entities = connection.Query<T>(Query, commandTimeout: 120);
Run Code Online (Sandbox Code Playgroud)
或者,您可以为所有查询设置默认超时:
SqlMapper.Settings.CommandTimeout = 120; // 2 min
Run Code Online (Sandbox Code Playgroud)