1

我正在从数据库中读取一堆查询。我遇到了查询未关闭的问题,因此我添加了 CommandTimeout。现在,每次运行时,各个查询都会从配置文件中读取。如何使用静态可空值和吸气剂使代码仅从配置文件中缓存一次 int。我正在考虑按照以下方式做一些事情:

static int? var;
get{ var = null;
    if (var.HasValue)
    ...(i dont know how to complete the rest)

我的实际代码:

private object QueryMethod(string item)
{
    using (SqlConnection connection = new SqlConnection(item))
    {
        connection.Open();

        using (SqlCommand sql = new SqlCommand())
        {
            AddSQLParms(sql);
            sql.CommandTimeout = 30;
            sql.CommandText = _cmdText;
            sql.Connection = connection;
            sql.CommandType = System.Data.CommandType.Text;

            sql.ExecuteNonQuery();
        }
        connection.Close();
    }
    return false;
}
4

4 回答 4

4

第一:不要打电话var

让我们称之为cached_value

static int? cached_value;

get { return cached_value ?? cached_value = your_logic_here }

这样,第一次调用它时,如果它为 null,它将初始化该字段。下次调用 getter 时,您将获得所需的值。

于 2013-11-11T23:47:02.650 回答
3

您可以使用Lazy<T>该类尝试这样的事情:

public static class ConfigCache
{
    private static Lazy<int> connectionTimeout =
        new Lazy<int>(() => int.Parse(
            ConfigurationManager.AppSettings["connectionTimeout"]));

    public static int ConnectionTimeout
    {
        get { return connectionTimeout.Value; }
    }
}

用法:

sqlCmd.CommandTimeout = ConfigCache.ConnectionTimeout;
于 2013-11-11T23:49:35.000 回答
0

听起来您在问如何使用 Nullable 变量。

static int? val;
get{ 
    if (var.HasValue)
    {
      return val.Value;
    }
    else {
       val = GetValFromConfig();
       return val.Value;
    }
} 

var是 C# 中的关键字

于 2013-11-11T23:53:55.910 回答
0

var 是系统关键字 - 不要使用它

V1 - 在这个版本中你希望 config 有一个值,否则会发生错误

static int? _timeout = null;

private static int GetTimeout()
{
    if (_timeout != null) return (int)_timeout;
    _timeout = GetTimeoutFromConfig();
    return (int)_timeout;
}

V2 - 在此版本中,如果配置为空,您将使用默认值

static int? _timeout = null;
private const int def_timeout = 120;   

private static int GetTimeout()
{
    if (_timeout != null) return (int)_timeout;
    int? to = GetTimeoutFromConfig();
    _timeout = (to ?? def_timeout); 

    return (int)_timeout;
}

从配置转换

private int? GetTimeoutFromConfig()
{
    int val;
    bool converted = int.TryParse(ConfigurationManager.AppSettings["TimeoutValue"], out val);

    return (converted ? val : null);
} 
于 2013-11-11T23:55:01.867 回答