如何将SqlDbtype.Money = 0与Sql server中的money字段进行比较

时间:2014-12-26 08:57:29

标签: c# sql

我有一个SQL server 2008.具有数据的表(Items)结构如下:

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子句之后将其转换为金钱。(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();

2 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分:0)

在我看来,你的逻辑被打破了。

我希望GetItemByPrize代价为800.54,我会收到价格为“”的商品。只需使用Price 0 default value创建not allow nulls字段即可。

更改程序:

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。