当我在我的SQL数据库(来自管理工作室)上运行以下脚本时,我得到了我期望的结果 -
SELECT *
FROM [Case]
WHERE ABS((DATEDIFF(DAY, [DateAccident], '2013-01-01'))) < 100;
当我增加/减少值100时,我会得到更多/更少的匹配。
然而,当我尝试从我的WinForms应用程序(在C#中)产生相同的结果时,我得到的结果远远超出我的预期 -
public static DataTable DOACases(DateTime doa, int days)
{
try
{
DataTable table = new DataTable();
string sqlText = "SELECT * " +
"FROM [Case] " +
"WHERE ABS((DATEDIFF(DAY, [DateAccident], " + doa.ToString().Substring(0,10) + "))) < " + days.ToString() + ";";
SqlCommand sqlCom = new SqlCommand(sqlText);
table = Express.GetTable(sqlCom);
return table;
}
catch (Exception eX)
{
throw new Exception("Case: DOACases(Date)" + Environment.NewLine + eX.Message);
}
}
我不知道为什么
PS。 Express.GetTable(sqlCom)只是在数据库上创建一个连接,并使用DataReader填充DataTable所需的代码并且已经工作了数百次,所以我怀疑问题是存在的。
答案 0 :(得分:1)
感谢allo-man,使用参数。
最终代码如下 -
public static DataTable DOACases(DateTime doa, int days)
{
try
{
DataTable table = new DataTable();
string sqlText = "SELECT * " +
"FROM [Case] " +
"WHERE ABS((DATEDIFF(DAY, [DateAccident], @Date))) < @Days;";
SqlCommand sqlCom = new SqlCommand(sqlText);
sqlCom.Parameters.Add("@Date", SqlDbType.Date).Value = doa;
sqlCom.Parameters.Add("@Days", SqlDbType.Int).Value = days;
table = Express.GetTable(sqlCom);
return table;
}
catch (Exception eX)
{
throw new Exception("Case: DOACases(Date)" + Environment.NewLine + eX.Message);
}
}
答案 1 :(得分:0)
你最好使用参数,但这里的问题是
'" + doa.ToString("yyyy-MM-dd" , CultureInfo.InvariantCulture) + "'
你需要单引号