如何解决操作数数据类型 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_createtimedatetime 数据类型

操作数数据类型 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-catchusing 语句。 好好学习,谢谢大家的贡献。

【讨论】:

以上是关于如何解决操作数数据类型 nvarchar 对减号运算符无效的主要内容,如果未能解决你的问题,请参考以下文章

SQL里,如何将数据类型nvarchar转换成float?

MSSQL数据类型nvarchar如何强行转为float类型.

在sql server数据库中将一个nvarchar类型的空值转换成decimal(18,3)类型

mssql乱码问题

运维堡垒机—如何解决企业运维操作审计问题?

运维堡垒机—如何解决企业运维操作审计问题?