我以我的一种形式拥有这段代码,
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConString))
{
query = "select SUM(TotalMinutes) as TotalMin, SUM(OTMinutes) as OTMin from EmpLog where EmpID = @EmpID and LogDate >= @empdate1 and LogDate <= @empdate2";
conn.Open();
using (SqlCommand cmd2 = new SqlCommand(query, conn))
{
cmd2.Parameters.AddWithValue("@empdate1", dtp_from.Value.ToString("yyyy-MM-dd"));
cmd2.Parameters.AddWithValue("@empdate2", dtp_to.Value.ToString("yyyy-MM-dd"));
cmd2.Parameters.Add(new SqlParameter() { ParameterName = "@EmpID", Value = listBox1.SelectedValue.ToString() });
var da = new SqlDataAdapter(cmd2);
DataTable dt = new DataTable();
da.Fill(dt);
decimal decminutes = Convert.ToDecimal(dt.Rows[0]["TotalMin]"].ToString());
decimal decOTminutes = Convert.ToDecimal(dt.Rows[0]["OTMin"].ToString());
我已经在不同的表单上制作了类似的代码,但不知怎的,这不起作用。我已经尝试过SqlDataReader,但它甚至不会进入一段时间的reader.read循环。
在通过ssms尝试查询时,它按预期工作。但如果我尝试其他方法,如sqldatareader,它将进入null异常。
编辑:我已经尝试从查询中删除WHERE子句,并且我能够返回行。
由于某些奇怪的原因,datetimepicker值未正确匹配数据库中的值。即使我将它转换为字符串,它完全匹配,但是再次,它仍然返回dbnull。
答案 0 :(得分:4)
BETWEEN
关键字
您可能需要考虑在SQL中使用BETWEEN
关键字来检查某个值是否存在于给定范围内,如此SQL示例所示:
SELECT SUM(TotalMinutes) AS TotalMin,
SUM(OTMinutes) AS OTMin
FROM EmpLog
WHERE EmpID = @EmpID
AND LogDate BETWEEN @empdate1 AND @empdate2"
避免不必要的投射
此外,您可能希望避免将DateTime值显式地转换为字符串。 SQL提供程序应该毫不费力地将这些值转换为适当的SQL等价物。
所以应用这两个变化,应该给你这样的东西:
using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
conn.Open();
var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
using (var cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
var da = new SqlDataAdapter(cmd2);
DataTable dt = new DataTable();
da.Fill(dt);
// Other code omitted for brevity
}
}
使用DataReader的示例
using (var conn = new SqlConnection(Properties.Settings.Default.ConString))
{
conn.Open();
var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2";
using (var cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value);
cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value);
cmd.Parameters.Add("@EmpID", listBox1.SelectedValue);
using(var reader = cmd.ExecuteReader())
{
while(reader.Read())
{
var minutes = Convert.ToDecimal(reader["TotalMin"]);
var otMinutes = Convert.ToDecimal(reader["OTMin"]);
// Do something here
}
}
}
}