使用日期条件获取数据值

时间:2014-04-11 02:06:06

标签: c# sql ms-access-2007

我在查询表达式

中遇到语法错误(缺少运算符)
string strSql2 = "Select N_Serie,MacID from " + cmdb_ModelStock2.Text + " WHERE Date_Ajout = " + cmdb_Date2.Text;

我一步一步地调试并调试,我看,它得到了日期和时间。      这可能是问题吗?如果可以的话,可以让它只获得日期而不是时间。

2 个答案:

答案 0 :(得分:3)

要做的第一件事就是停止构建这样的SQL。如果确实需要动态选择表格,您应该确保使用有效的白名单...但是对于"其中"您应该使用参数化SQL - 将cmdb_Date2.Text解析为DateTime,并将其指定为参数值。使用参数化SQL可以保护您免受SQL injection attacks的攻击,避免转换问题,并使您更容易阅读SQL。

所以:

string tableName = ValidateTableName(cmdb_ModelStock2.Text); // TODO: Write this!
DateTime date = DateTime.Parse(cmdb_Date2.Text); // See below
string sql = "Select N_Serie,MacID from " + tableName + " WHERE Date_Ajout = ?";
using (var command = new OleDbCommand(sql, conn))
{
    // Or use type "Date", perhaps... but that would be more appropriate
    // with a range. The name doesn't matter using OLE, which uses positional
    // parameters.
    command.Parameters.Add("Date", OleDbType.DBDate).Value = date;
    // Execute the command etc
}

请注意,我在这里使用DateTime.Parse,但理想情况下,您使用直接提供DateTime的UI控件。 (我们不知道您正在使用哪种UI,这使得很难在此处提供建议。)

根据您在数据库中使用的数据类型,您可能希望使用BETWEEN查询而不是完全匹配。

答案 1 :(得分:0)

你最好使用参数作为日期,如下所示

string strSql2 = "Select N_Serie,MacID from " + cmdb_ModelStock2.Text + " WHERE Date_Ajout = ?";

cmdb_Date2创建日期时间,例如,如果日期时间格式为“yyyy-MM-dd HH:mm”,则

DateTime dt = 
    DateTime.ParseExact(cmdb_Date2.Text, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);

现在您可以设置参数值,如下所示

cmd.Parameters.Add("Date_Ajout ", OleDbType.Date).Value = dt;

执行cmd

相关问题