获取每个日期的差异并插入数据库

时间:2013-04-27 18:22:17

标签: c# database ado.net

我有一个包含(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;
    }

我希望从今天起每个Datecolumn获取每个GetBusinessDays值。 并将其插入每个相应的差异列。

例如

ID  Date        Difference
1   4-22-2013
2   4-23-2013
3   4-24-2013

假设今天的日期是2013年3月28日。差异必须分别包含6,5,4。

这就是我现在所做的,但它不起作用:(

        myDatabaseConnection.OpenConnection();
        mySqlCommand.CommandType = CommandType.Text;
        mySqlCommand.CommandText = "select * from Table1 where Difference IS Null";
        SqlDataReader sqlreader = mySqlCommand2.ExecuteReader();

        int i;

        while (sqlreader.Read())
        {
            i = sqlreader.GetInt32(0);
            double y = GetBusinessDays(sqlreader.GetDateTime(1), DateTime.Now);
            string commandtext = "Update Table1 SET Difference = " + y + " Where ID = " + i + " ";
            mySqlCommand.CommandText = " " + commandtext + " ";
        }
        myDatabaseConnection.CloseConnection();

1 个答案:

答案 0 :(得分:1)

首先,您似乎错过了对mySqlCommand.ExecuteNonQuery()的调用。在您分配到while后,这应该在mySqlCommand.CommandText循环中。

在迭代结果集时,您还需要为更新查询使用单独的SqlCommand对象,作为SqlDataReader的{​​{3}}。我还建议使用existing one is being used 始终。把这两点放在一起:

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,但您没有显示Table1的确切定义。确保Difference列允许NULL值,并且没有设置默认值(或者默认值为NULL)。

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

  1. select查询中指定列名:

    select [id], [date], [difference] from [Table1] where [difference] is null
    
  2. 通过SqlDataReader检索列的值时,请勿对列的序号进行硬编码(0,1,2,...)。而是使用GetOrdinal()方法动态确定列的序数。例如:

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

    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提到他必须在数据库连接上启用parameterized SQL才能使用它的应用程序。为此,请将“MultipleActiveResultSets = True”添加到数据库连接字符串中。

相关问题