我有一个包含(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();
答案 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)。
为了保证列符合您的预期,我建议您执行以下操作之一。
在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
语句来保证清理这些对象。
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”添加到数据库连接字符串中。