C# 获取每个日期的差异并插入数据库
我有一个包含不同日期的(IDcolumn,int)、(Differencecolumn,int)和(Datecolumn DateTime)的表 还有一种计算日期差的方法,忽略了周末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 *
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"));
使用
语句来保证这些对象将被清理
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();
}
}
}