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

C#执行SQL查询遇语法错误:nvarchar类型Date_Time字段查询问题

问题分析与解决方案

你的问题出在直接拼接字符串到SQL语句中,没有对字符串类型的字段值添加单引号,同时这种写法还存在严重的SQL注入风险。

错误原因

当Date_Time是nvarchar(50)类型时,SQL语句中匹配字符串值必须用单引号包裹。你的代码拼接后生成的SQL会是类似这样:

Select Total_Sale from Daily_Sale Where Date_Time =2024-05-20 14:30:00

这个语句里的日期时间没有单引号,SQL引擎会把它当成表达式解析,自然会报语法错误。

另外补充个小细节:你之前调用cmd.ExecuteNonQuery()是多余的,ExecuteScalar直接就能执行查询并返回结果,不需要先调用ExecuteNonQuery。

正确的写法(推荐使用参数化查询)

参数化查询不仅能避免语法错误,还能彻底杜绝SQL注入风险,这是操作数据库的最佳实践。修改你的代码如下:

// 获取最大日期时间,直接用ExecuteScalar即可
var cmd = new SqlCommand("Select Max(Date_Time) From Daily_Sale ", con);
string date_tim = cmd.ExecuteScalar()?.ToString(); // 增加空值判断更安全

if (!string.IsNullOrEmpty(date_tim))
{
    // 使用参数化查询构建语句
    var cmdc = new SqlCommand("Select Total_Sale from Daily_Sale Where Date_Time = @DateTime", con);
    // 添加参数并赋值
    cmdc.Parameters.AddWithValue("@DateTime", date_tim);
    
    // 执行查询并获取结果
    var totalSaleResult = cmdc.ExecuteScalar();
    if (totalSaleResult != DBNull.Value)
    {
        MessageBox.Show("Total Sale: " + totalSaleResult.ToString());
    }
    else
    {
        MessageBox.Show("No matching record found.");
    }
}

不推荐的临时修复(仅作理解用)

如果你一定要用字符串拼接(强烈不建议),需要给date_tim加上单引号,同时还要处理值里可能存在的单引号(比如日期时间里如果有单引号会导致新的错误):

// 注意:这种方式存在SQL注入风险,仅临时应急使用
string safeDateTime = date_tim.Replace("'", "''"); // 转义字符串中的单引号
var cmdc = new SqlCommand($"Select Total_Sale from Daily_Sale Where Date_Time = '{safeDateTime}'", con);

内容的提问来源于stack exchange,提问作者hamid jalil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:52:57