Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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,我有一个包含不同日期的(IDcolumn,int)、(Differencecolumn,int)和(Datecolumn DateTime)的表 还有一种计算日期差的方法,忽略了周末 public static double GetBusinessDays(DateTime startD, DateTime endD) { double calcBusinessDays = 1 + ((endD - startD).TotalDays *

我有一个包含不同日期的(IDcolumn,int)、(Differencecolumn,int)和(Datecolumn DateTime)的表

还有一种计算日期差的方法,忽略了周末

    public static double GetBusinessDays(DateTime startD, DateTime endD)
    {
        double calcBusinessDays =
            1 + ((endD - startD).TotalDays * 5 -
            (startD.DayOfWeek - endD.DayOfWeek) * 2) / 7;

        if ((int)endD.DayOfWeek == 6) calcBusinessDays--;
        if ((int)startD.DayOfWeek == 0) calcBusinessDays--;

        return calcBusinessDays;
    }
我想从date today开始获取每个date列上的每个GetBusinessDays值。 并将其插入到每个对应的不同列中

比如说

ID  Date        Difference
1   4-22-2013
2   4-23-2013
3   4-24-2013
假设今天的日期是2013年4月28日。差值必须分别包含6、5、4

这是我目前所做的,但不起作用:(


首先也是最重要的一点是,您似乎缺少对
mySqlCommand.ExecuteNonQuery()
的调用。在分配给
mySqlCommand.CommandText
之后,该调用应该进入
while
循环中

您还需要为更新查询使用单独的
SqlCommand
对象,就像迭代结果集时
SqlDataReader
所做的那样。我还建议始终使用。将这两点放在一起:

SqlCommand myUpdateCmd = new SqlCommand("Update [Table1] SET [Difference] = @Difference Where [ID] = @ID", myDatabaseConnection);
myUpdateCmd.Parameters.AddWithValue("@ID", i);
myUpdateCmd.Parameters.AddWithValue("@Difference", (int)y);
myUpdateCmd.ExecuteNonQuery();
除此之外,以下是一些您可能会觉得有用的建议:

您似乎假设差异列最初为NULL,但没有显示表1的确切定义。请确保差异列允许NULL值,并且没有设置默认值(或默认值为NULL)

为了保证列的顺序符合您的期望,我建议您执行以下操作之一

  • select
    查询中指定列名:

    select [id], [date], [difference] from [Table1] where [difference] is null
    
  • 通过
    SqlDataReader
    检索列的值时,不要硬编码列的序号(0、1、2等)。相反,使用
    GetOrdinal()
    方法动态确定列的序号。例如:

    i = sqlreader.GetInt32(sqlreader.GetOrdinal("id"));
    
  • 几乎所有这些ADO.NET对象都是IDisposable。因此,通常最好使用C的
    使用
    语句来保证这些对象将被清理

    using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString))
    {
        // code that uses myDatabaseConnection goes here
    }
    
    将所有这些要点放在一起,我们最终得出:

    using (SqlConnection myDatabaseConnection = new SqlConnection("DB connection string goes here"))
    {
        myDatabaseConnection.Open();
    
        using (SqlCommand mySqlCommand = new SqlCommand("select [id], [difference], [date] from [Table1] where [difference] is null", myDatabaseConnection))
        using (SqlDataReader sqlreader = mySqlCommand.ExecuteReader())
        using (SqlCommand myUpdateCmd = new SqlCommand("update [Table1] set [difference] = @difference where [id] = @id", myDatabaseConnection))
        {
            int i;
    
            myUpdateCmd.Parameters.Add("@id", SqlDbType.Int);
            myUpdateCmd.Parameters.Add("@difference", SqlDbType.Int);
    
            while (sqlreader.Read())
            {
                i = sqlreader.GetInt32(sqlreader.GetOrdinal("id"));
                double y = GetBusinessDays(sqlreader.GetDateTime(sqlreader.GetOrdinal("date")), DateTime.Now);
                myUpdateCmd.Parameters["@id"].Value = i;
                myUpdateCmd.Parameters["@difference"].Value = (int)y;
                myUpdateCmd.ExecuteNonQuery();
            }
        }
    }
    

    更新:Karlx提到,在应用程序正常工作之前,他必须启用数据库连接。为此,请在数据库连接字符串中添加“MultipleActiveResultSets=True”。

    好的,我会试试。不关闭数据库连接可以吗?只要数据库连接对象实现IDisposable接口即可(SqlConnection有)然后当执行到达
    using
    块的末尾时,它将为您关闭-在这种情况下,最外层的using块。错误“已经有一个打开的DataReader与此命令关联,必须先关闭”。我在executenotquery之前添加sqlreader.close,只有1行更新并出现错误“当读卡器关闭时调用Read的尝试无效。这就是为什么我说“您还需要为更新查询使用单独的SqlCommand对象,因为SqlDataReader正在使用现有对象”。请注意,在我的完整示例代码(底部)中,我使用的是myUpdateCmd。“MultipleActiveResultSets=True”必须添加到ConnectionString才能使其工作:)。非常感谢David:)
    using (SqlConnection myDatabaseConnection = new SqlConnection("DB connection string goes here"))
    {
        myDatabaseConnection.Open();
    
        using (SqlCommand mySqlCommand = new SqlCommand("select [id], [difference], [date] from [Table1] where [difference] is null", myDatabaseConnection))
        using (SqlDataReader sqlreader = mySqlCommand.ExecuteReader())
        using (SqlCommand myUpdateCmd = new SqlCommand("update [Table1] set [difference] = @difference where [id] = @id", myDatabaseConnection))
        {
            int i;
    
            myUpdateCmd.Parameters.Add("@id", SqlDbType.Int);
            myUpdateCmd.Parameters.Add("@difference", SqlDbType.Int);
    
            while (sqlreader.Read())
            {
                i = sqlreader.GetInt32(sqlreader.GetOrdinal("id"));
                double y = GetBusinessDays(sqlreader.GetDateTime(sqlreader.GetOrdinal("date")), DateTime.Now);
                myUpdateCmd.Parameters["@id"].Value = i;
                myUpdateCmd.Parameters["@difference"].Value = (int)y;
                myUpdateCmd.ExecuteNonQuery();
            }
        }
    }