如何解决操作数数据类型 nvarchar 对减号运算符无效
Posted
技术标签:
【中文标题】如何解决操作数数据类型 nvarchar 对减号运算符无效【英文标题】:How to resolve operand data type nvarchar is invalid for minus operator 【发布时间】:2022-01-07 19:32:38 【问题描述】:我有一个 SQL 查询,它试图获取过去一小时内创建的所有记录
string query = "select * from Monarchchangelog mcl WHERE LOWER(mcl.mcl_usercomment) LIKE 'bolt%' AND mcl.mcl_createtime > DATEADD(MINUTE, -@minutesBack, GETDATE()) ORDER BY mcl.mcl_createtime DESC";
string tablename = "NEW_UPDATES";
string minutesBack = "60"; //set by another function but for eg sake I've hardcoded the value
SqlCommand command = new SqlCommand(query);
command.Parameters.AddWithValue("minutesBack", minutesBack);
DataSet ds = RunQuery(command, tablename);
我正在使用下面的代码执行
private DataSet RunQuery(SqlCommand command, String tablename)
DataSet ds = null;
SqlDataAdapter adapter = null;
using (SqlConnection oc = new SqlConnection(CONNECTIONSTRING))
try
oc.Open();
command.CommandType = CommandType.Text;
command.Connection = oc;
adapter = new SqlDataAdapter(command);
ds = new DataSet();
adapter.Fill(ds, tablename);
catch
if (ds != null)
ds.Dispose();
finally
if (oc != null)
oc.Close();
oc.Dispose();
return ds;
当我尝试执行此代码时,我收到以下错误,但 mcl_createtime
是 datetime
数据类型
操作数数据类型 nvarchar 对减号运算符无效
谁能告诉我我哪里出错了 谢谢
【问题讨论】:
-@minutesBack
- 您将此参数作为字符串而不是数字传递。也强烈建议不要使用AddWithValue
@DaleK 你能告诉我如何将此参数作为数字传递吗? AddWithValue 的最佳替代方法是什么?
@m_beta 在 Dale 刚刚给你的链接中有一个关于如何做到这一点的例子。在链接中,在他们描述了AddWithValue
的问题后,他们会告诉您替代方案。是的,我避免告诉你函数的确切名称,这样你就可以获得链接的有用信息,并且不仅知道你应该使用什么函数,而且知道你为什么要这样做。
using() 语句的重点是,您不必编写代码来捕获异常并手动处理
@Cleptus:数据集不需要 dispose:***.com/questions/913228/…。我经常使用 ADO.NET 编写代码。
【参考方案1】:
在@DaleK 的评论的帮助下,我解决了这个问题,替换了代码
command.Parameters.AddWithValue("minutesBack", minutesBack);
这件作品
command.Parameters.Add("minutesBack", SqlDbType.Int).Value = minutesBack;
传递参数的一种好方法是明确提及 sql 数据类型以避免此类数据类型问题。更多详情请关注链接 AddWithValue vs Add。
所以我将参数作为数字而不是字符串传递,也很好地理解了try-catch
、using
语句。
好好学习,谢谢大家的贡献。
【讨论】:
以上是关于如何解决操作数数据类型 nvarchar 对减号运算符无效的主要内容,如果未能解决你的问题,请参考以下文章
MSSQL数据类型nvarchar如何强行转为float类型.