【问题标题】:I am getting syntax error in dynamic cretated SQL statement,near LIKE operator我在动态创建的 SQL 语句中遇到语法错误,靠近 LIKE 运算符
【发布时间】:2020-02-11 18:51:34
【问题描述】:

我正在尝试编写动态 SQL 语句,但出现异常语法错误,靠近我在 SQL 语句中使用的 LIKE 运算符 webmethod.asmx.cs

[WebMethod]
                    public void leavesRequest_data_to_hr()
                    {
                        List<leavesrecord> record = new List<leavesrecord>();
                        string Todaydate = DateTime.Now.ToString("dd-MM-yyyy");
                        string status = "Pending";
                        SqlConnection connection = new SqlConnection("Data Source = AMARNATHB; Initial Catalog = sample; Integrated Security = True");
                        SqlCommand cmd = new SqlCommand("select leaverequest.id,leaverequest.emp_id,leaverequest.date_inserted,leavesSignup.name,leaverequest.leaves_form,leaverequest.leaves_upto,leaverequest.leave_type,leaverequest.description,leaverequest.no_of_leaves from leaverequest inner join leavesSignup on leaverequest.emp_id = leavesSignup.emp_id where leaverequest.date_inserted like '%'"+Todaydate+"'%' and leaverequest.status='" + status + "'", connection);
                        cmd.CommandType = CommandType.Text;
                        connection.Open();
                        SqlDataReader idr = cmd.ExecuteReader();
                        while (idr.Read())
                        {
                        }
        }

【问题讨论】:

  • 你应该真正考虑使用参数而不是连接你的变量。它可以防止像 '%'"+Todaydate+"'%' 而应该是 '%"+Todaydate+"%' 之类的问题,这也取决于 date_inserted 是否为字符串。
  • 为什么要使用带有日期限定符的 LIKE? 2020-02-11 是“喜欢”2020-02-12 吗?他们比2020-12-02 更相似吗?使用 SQL 参数。 就是这样
  • like 用于字符串/varchar 等。

标签: c# sql asmx


【解决方案1】:

这个逻辑有多个问题:

" . . . leaverequest.date_inserted like '%'" + Todaydate + "'%' . . .

首先,它产生的是:

leaverequest.date_inserted like '%'<some date value here>'%'

有额外的无意义单引号导致语法错误。

比语法错误更重要的是这两个问题:

  • 您(可能)将日期列视为字符串。啊! like 用于字符串而非日期。
  • 您传入的值会影响您的查询字符串。这会使代码容易受到 SQL 注入的影响。它会使代码出现难以调试的错误。

让数据库完成工作怎么样?

" . . . convert(date, leaverequest.date_inserted) = convert(date, getdate()) . . .

我假设您使用的是 SQL Server。但类似的结构存在于所有数据库中。

并且,所有其他参数值都应作为参数传入,而不是通过修改查询字符串。

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 2018-09-14
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多