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
相关产品推荐
相关产品推荐

