You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm双条件查询数据报错:Incorrect syntax near ',' 求助

问题解决:SQL语法错误与安全优化

核心错误原因

你遇到的Incorrect syntax near ','错误,是因为SQL语句的WHERE子句中,两个查询条件之间用了逗号分隔——SQL里多条件查询必须用AND(或逻辑需要的OR)来连接条件,而不是逗号。

修正后的代码(含安全优化)

先修复语法问题,同时必须替换为参数化查询(直接拼接用户输入存在严重的SQL注入风险,还可能因日期格式、特殊字符引发其他错误):

private void DisplayDataGrid()
{
    // 编写参数化SQL语句,避免拼接字符串
    string sqlQuery = @"SELECT NamaStasiun, Tanggal, Hour00, Hour01, etc, Hour23 
                        FROM [TableName] 
                        WHERE NamaStasiun LIKE @StationName 
                        AND Tanggal BETWEEN @StartDate AND @EndDate";

    // 使用using确保资源正确释放
    using (SqlCommand cmd = new SqlCommand(sqlQuery, connection))
    {
        // 添加查询参数
        cmd.Parameters.AddWithValue("@StationName", "%" + comboBoxNamaStasiun.Text + "%");
        // 直接传递Date属性,避免字符串格式问题
        cmd.Parameters.AddWithValue("@StartDate", DatePickerAwal.Value.Date);
        cmd.Parameters.AddWithValue("@EndDate", DatePickerAkhir.Value.Date);

        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataTable dataTable = new DataTable();
        
        adapter.Fill(dataTable);
        datagridshowdataexport.DataSource = dataTable;
    }
}

重要说明

  1. 语法修复点:把原代码中WHERE子句里的逗号替换为AND,让站点名和日期范围两个条件形成逻辑与的关系。
  2. 安全与可靠性优化:
    • 参数化查询能彻底避免SQL注入攻击,这是直接拼接字符串的写法无法做到的。
    • 直接传递DateTime类型的Date属性,不需要转成字符串,数据库会自动处理日期格式,避免因系统区域设置不同导致的日期解析错误。
  3. 额外建议:使用using语句包裹SqlCommand,确保数据库资源能被正确释放。

内容的提问来源于stack exchange,提问作者Iman Ahmadi Hardiyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:30:32