-3

为什么我会收到此错误,我该如何解决?

ADO.NET 代码:

myConnection.Open();

string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = '" + DateTime.Today + "' AND User = '" +     UserBox.Text + "'";

SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);

int P = Convert.ToInt32(Pexist.ExecuteScalar().ToString());

myConnection.Close();

错误:

从字符串转换日期和/或时间时转换失败。

4

3 回答 3

4

您收到此错误是因为您不使用参数。

string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = @dt " + 
                 "AND User = @usr " +     
                 "AND Item = @itm " + 
                 "AND Name = @name";

 SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);
 Pexist.Parameter.AddWithValue("@dt", DateTime.Today);
 Pexist.Parameter.AddWithValue("@usr", UserBox.Text);
 Pexist.Parameter.AddWithValue("@itm", ID505.Text);
 Pexist.Parameter.AddWithValue("@name", DropDownList1.SelectedItem.ToString());
 object result = Pexist.ExecuteScalar();
 int P = (result == null ? 0 : Convert.ToInt32(result));
 myConnection.Close();

当您使用参数时,您让数据库引擎处理您的输入字符串。数据库引擎知道如何处理日期、字符串和数字。您无需解析问题,并且避免了Sql 注入攻击。

例如,如果文本框 ID505 包含单引号,查询字符串中会发生什么情况?

此外,ExecuteScalar 返回一个对象

结果集中第一行的第一列,如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)

因此,最好在尝试将结果转换为整数之前检查 null。

编辑一段时间后回顾这个问题,我应该补充一点,在这种特殊情况下,来自 ExecuteScalar 的返回永远不会为空。之所以如此,是因为查询使用聚合函数 COUNT(*),即使在未找到记录的情况下也将始终返回一个有效数字。

于 2012-11-21T23:08:26.710 回答
0

一定要使用参数。它更安全,可以帮助您解决此类转换问题......

string cmdStr = " SELECT COUNT(*) FROM Sale WHERE Date = @d AND User = @u AND Item = @i AND Name = @n";
SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);
Pexist.Parameters.Add("d", SqlDataType.DateTime).Value = DateTime.Today;

等等...

于 2012-11-21T23:05:40.373 回答
-2

将 DateTime.Today 替换为 DateTime.Today.ToString("yyyy/MM/dd") 应该可以解决您的问题。

于 2012-11-21T23:07:13.470 回答