使用数据库最佳实践?

时间:2009-06-29 06:41:57

标签: c# database ado.net

我有一个C#数据库层,它使用静态读取方法,在后台计时器中每秒调用一次。

目前我创建了SqlCommand,SqlConnection曾作为类memeber。

在每个方法调用中我执行命令来获取结果,我这样做是为了避免每秒创建连接和命令,但我担心这个方法会发生异常,会破坏连接或将对象放入无效的状态。

这是我目前的实现(Timer Handler)

    static void GetBarTime(object state)
    {
        lock (_staticConnection)
        {
            SqlDataReader dataReader = null;
            try
            {
                dataReader = _getMaxTimeCommand.ExecuteReader();
                dataReader.Read();
                _currentTick = dataReader.GetInt32(0);
            }
            catch (Exception ex)
            {
                //Log the error
            }
            finally
            {
                dataReader.Dispose();
            }
        }
    }

最佳做法是什么?

更多细节:

我在计时器中执行此操作,因为每秒都会有另一个prorcess更新我的表,并且客户端使用另一个公开的方法,并且每秒调用一次以获取最新值。

因此,不是每秒为每个客户端执行select语句,而是在计时器中执行它并更新客户端使用的全局变量。

2 个答案:

答案 0 :(得分:2)

SqlConnection内置了游泳池;如果使用的话,你会发现几乎没有区别:

using(SqlConnection conn = new SqlConnection(connectionString)) {
    conn.Open();
    // your code
}

每一次。这可以自动对死(基础)连接作出反应。

目前你有一个bug,顺便说一下;如果命令失败,读者仍然为空...在调用null之前检查Dispose()

if(dataReader !=null) {dataReader.Dispose();}

或只使用using

 try
 {
     using(SqlDataReader dataReader = _getMaxTimeCommand.ExecuteReader())
     {
         dataReader.Read();
         _currentTick = dataReader.GetInt32(0);
     }
 }
 catch (Exception ex)
 {
    //Log the error
 }

答案 1 :(得分:1)

很难确定一个execption是否意味着连接是一个死鸭。为了安全起见,您可以在遇到异常时关闭并重新打开SqlConnection和SqlCommand,以防万一。当一切正常时,这不会导致任何开销。