如何将 SqlDbtype.Money = 0 与 Sql 服务器中的货币字段进行比较

Posted

技术标签:

【中文标题】如何将 SqlDbtype.Money = 0 与 Sql 服务器中的货币字段进行比较【英文标题】:How to compare SqlDbtype.Money = 0 with money field in Sql server 【发布时间】:2014-12-26 08:57:29 【问题描述】:

我有一个 SQL server 2008。我有数据的表(项目)结构如下:

ID(int)   Name(varchar(50))         Price(money)
 1        ArchBook                 1200.89
 2        Freebie                  0.00
 3        Board                    800.54

这些列的数据类型在 () 中。我有一个以价格为参数的选择存储过程

 create procedure dbo.GetItemByPrice
 @price money 
 as
 begin
 if @price = '' OR @price is NULL
 set @price = ''
 select * from dbo.Items 
 where @price = '' OR price = @price
 end

当我从 C# 代码发送价格为 0 时,结果不正确。在 if 子句之后,我在存储过程中使用 cast 再次将其转换为货币。(How do I convert from a money datatype in SQL server?) 但它似乎不起作用。与 0 相比,我可以如何照顾的任何建议?如果价格为空,则返回所有记录。 C#代码

            cnn.Open();               
            string amount = "0";
            var command = new SqlCommand("GetItemsByPrice", cnn);
            command.CommandType = CommandType.StoredProcedure;
            var param = new SqlParameter("@price", SqlDbType.Money);
            param.Value = Convert.ToDecimal(amount);
            command.Parameters.Add(param);
            var dataReader = command.ExecuteReader();
            while (dataReader.Read())
            
               //printing columns

            
            dataReader.Close();
            command.Dispose();

【问题讨论】:

检查我的答案,如果对你有帮助,请告诉我。 【参考方案1】:

我认为你的逻辑是错误的。

我想GetItemByPrize 获取价格800.54,我将收到价格为“”的商品。只需使用default value 0not allow nulls 制作Price 字段。

更改程序:

CREATE PROCEDURE dbo.GetItemByPrice
@price money 
as
BEGIN
select * from dbo.Items 
where price = @price
END

编辑:

如果您从文本框中获取价格值作为示例:这里是代码示例

decimal price = 0;

decimal.TryPrase(priceTxtBox.Text, out price);

cmd.Parameters.AddWithValue(@"price", price)

这将保证当文本框值为“”或无效文本时价格参数为0。

【讨论】:

如果发送的价格为空,我如何处理需要返回表中所有值的情况? 关于 ui 价格是一个过滤条件。它可以是空的。所以我不能明确地将其设为零。如果为空,我想将其从 SP 中排除。 @Eve 显示您的代码...如果您想在为空时不执行,只需添加一个如果不执行该过程.. 在问题中添加您的代码。 我的错。好像我犯了一个错误。毕竟我根本不能发送空的。你有什么办法可以建议我如何处理这种情况?空和零?。如果没有在 Price 列上应用过滤,则返回所有列,如果是返回该价格的项目 @Eve 我不会使用程序。我将创建 sql select * from dbo.Items 和 if Price != null && Price!=0 添加带有条件的 where 子句并在这种情况下添加参数。在其他情况下,我将只执行 Select * from dbo.Items。如果这对您有帮助,请将答案设为正确。【参考方案2】:

试试这个

CREATE PROCEDURE dbo.GetItemByPrice
@price money 
as
BEGIN
if @price = '' OR @price is NULL
SET @price = ''
select * from dbo.Items 
where @price = '' OR price = @price
END

【讨论】:

我已添加设置。我打错字了。这没有帮助 您是否尝试从 SSMS/SqlCmd 执行此 SP?查看它是否返回正确的结果,然后从您的 C# 代码中检查。如果它适用于 SSMS 而不是 C# 代码,请发布执行 SP 的代码部分。 来自 ssms。问题出在SP上。我需要处理价格可以为空的情况,在这种情况下我需要从表中返回所有字段。价格也可以为零;在这种情况下,我需要返回价格为 0 的所有记录 问题不可能出在 SP 上。它适用于我的 SQL Server 2008 R2 实例。我测试了它。它可能与您的 C# 代码有关。

以上是关于如何将 SqlDbtype.Money = 0 与 Sql 服务器中的货币字段进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将跨域资源共享与 Spring MVC 4.0.0 RESTful Webservice 集成

从 bigquery 查询整行时如何将模式与行合并 - java

如何将PhpStorm与Xdebug连接

如何将 oAuth2.0 与 Spring boot 1.5.8.RELEASE 集成

如何将 CameraX 与 PreviewView 一起使用?

将 D3.js 7.0.0 与 Next.js 11.0.1 一起使用时,如何解决“[ERR_REQUIRE_ESM]:必须使用导入来加载 ES 模块”?