Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用数据库最佳实践?_C#_Database_Ado.net - Fatal编程技术网

C# 使用数据库最佳实践?

C# 使用数据库最佳实践?,c#,database,ado.net,C#,Database,Ado.net,我有一个C数据库层,它使用静态读取方法,在后台计时器中每秒调用一次 目前我创建了SqlCommand,SqlConnection作为一个类memeber 在每次方法调用中,我都会执行命令以获得结果,这样做是为了避免每秒创建连接和命令,但我担心此方法中会出现异常,导致连接中断或对象处于无效状态 这是我当前的实现计时器处理程序 static void GetBarTime(object state) { lock (_staticConnection)

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

目前我创建了SqlCommand,SqlConnection作为一个类memeber

在每次方法调用中,我都会执行命令以获得结果,这样做是为了避免每秒创建连接和命令,但我担心此方法中会出现异常,导致连接中断或对象处于无效状态

这是我当前的实现计时器处理程序

    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();
            }
        }
    }
最好的做法是什么

更多详情:

我是在一个计时器中这样做的,因为有另一个进程每秒更新一次我的表,还有另一个公开的方法由一组客户端使用,并每秒调用以获取最新的值


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

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

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

SqlConnection内置了池;如果使用以下选项,您几乎看不到任何差异:

using(SqlConnection conn = new SqlConnection(connectionString)) {
    conn.Open();
    // your code
}
每一次。这可以自动对死掉的底层连接做出反应

顺便说一句,你现在有一个bug;如果命令失败,读卡器仍将为空。。。在调用Dispose之前检查null:

或者只使用:

SqlConnection内置了池;如果使用以下选项,您几乎看不到任何差异:

using(SqlConnection conn = new SqlConnection(connectionString)) {
    conn.Open();
    // your code
}
每一次。这可以自动对死掉的底层连接做出反应

顺便说一句,你现在有一个bug;如果命令失败,读卡器仍将为空。。。在调用Dispose之前检查null:

或者只使用:


你能解释一下这个场景吗?为什么你需要在定时器中写代码来从数据库中读取数据?DB值的变化频率有多高?您能解释一下这个场景吗?为什么需要在定时器中编写代码来读取DB中的内容?DB值更改的频率有多高?因此我可以使用相同的代码,但只是在异常处理中关闭并再次打开连接?我觉得更好:在异常处理程序中,只需关闭它并将其设置为null。在GetBarTime中,在锁块中检查连接是否为空;如果是,请打开它并创建SqlStatement。通过这种方式,当数据库在一段时间内不可用时,可以更容易地避免问题。继续,因为如果出现异常,重新打开连接也可能会失败…因此我可以使用相同的代码,但只是在异常处理中,只需关闭并再次打开连接即可?更好:在异常处理程序中,只需关闭它并将其设置为null。在GetBarTime中,在锁块中检查连接是否为空;如果是,请打开它并创建SqlStatement。通过这种方式,当数据库在一段时间内不可用时,更容易避免问题。继续,因为如果出现异常,重新打开连接也可能失败…很好,但从逻辑上讲,是更好还是为每次调用创建连接和命令?通常是的,每次调用都更好;您在状态管理/线程化等方面没有问题。这在一定程度上还取决于命令的外观—例如,存储过程在保留准备好的命令方面没有任何真正的优势。我不是问一般情况,我的情况是每秒调用一次方法,我知道有连接池,但打开和关闭连接每次调用都会花费一些时间,与此mehodNo的专用连接相比,不是真的-基础连接保持打开状态。你只有时间从托管池中获取数据,这是绝对微小的,你永远无法与进程外的时间和可能基于网络的服务器IO的时间相比来衡量这一点。很好,但从逻辑上讲,是更好还是为每个调用创建连接和命令更好?通常是的,每次调用都更好;您在状态管理/线程化等方面没有问题。这在一定程度上还取决于命令的外观—例如,存储过程在保留准备好的命令方面没有任何真正的优势。我不是问一般情况,我的情况是每秒调用一次方法,我知道有连接池,但打开和关闭连接每次调用都会花费一些时间,与此mehodNo的专用连接相比,不是真的-基础连接保持打开状态。你只有时间从法力恢复 ged池是一个非常小的池,与进程外的时间相比,您永远无法衡量这一点,而且可能无法与服务器的基于网络的IO进行比较。
 try
 {
     using(SqlDataReader dataReader = _getMaxTimeCommand.ExecuteReader())
     {
         dataReader.Read();
         _currentTick = dataReader.GetInt32(0);
     }
 }
 catch (Exception ex)
 {
    //Log the error
 }