C# 为什么sql函数返回null?

C# 为什么sql函数返回null?,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,我有功能 CREATE FUNCTION [dbo].[fn_Get_Price_For_Circulation] (@TypeID int, @Count int, @Info xml) RETURNS float AS BEGIN declare @Result float; if @TypeID = 9 BEGIN if @Count = 50 set @Result = 400; else if (@Cou

我有功能

CREATE FUNCTION [dbo].[fn_Get_Price_For_Circulation] (@TypeID int, @Count int, @Info xml)
RETURNS float
AS
BEGIN
    declare @Result float;

    if @TypeID = 9
    BEGIN
        if @Count = 50
            set @Result = 400;
        else if (@Count = 100)
            set @Result = 600;
        else if (@Count = 250)
            set @Result = 1000;
        else if (@Count = 500)
            set @Result = 1700;
        else if (@Count = 1000)
            set @Result = 2600;
        else if (@Count = 2000)
            set @Result = 4000;
    END
        RETURN @Result;
END
我有C代码

当我发送
@TypeID=9
@Count=50
@Info=”“
,C#返回null,但当我从SQL Server Management Studio发送相同的参数时,函数返回400。为什么?

更新:我找到了解决方案

 myCommand.Parameters.Add("@ReturnValue", SqlDbType.Float);
 myCommand.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue;

 myCommand.ExecuteNonQuery();

 return myCommand.Parameters["@ReturnValue"].Value;

我看到人们在评论中这样说,但我将以代码的形式来表达

您正试图调用一个用户定义的函数,就好像它是一个存储过程一样。不幸的是,这些是非常不同的事情。您需要的是通过
SELECT
语句调用它:

using (SqlCommand myCommand = new SqlCommand("SELECT fn_Get_Price_For_Circulation(@TypeID, @Count, @Info)", cn))
{
    myCommand.Parameters.AddWithValue("@TypeID", typeID);
    myCommand.Parameters.AddWithValue("@Count", pCount);

    if (selxml == null)
        myCommand.Parameters.AddWithValue("@Info", string.Empty);
    else
        myCommand.Parameters.AddWithValue("@Info", selxml.ToString());

    return myCommand.ExecuteScalar();
}
为了便于阅读,我还冒昧地将参数更改为使用
AddWithValue

至于为什么它可能返回
NULL
,这是一个函数编写是否正确的问题。现在,检查结果是否为多个值之一。你确定你不想测试他们之间的关系吗

if @Count < 50
    set @Result = 400;
else if (@Count < 100)
    set @Result = 600;
else if (@Count < 250)
    set @Result = 1000;
else if (@Count < 500)
    set @Result = 1700;
else if (@Count < 1000)
    set @Result = 2600;
else if (@Count < 2000)
    set @Result = 4000;
如果@Count<50
设置@Result=400;
否则如果(@Count<100)
设置@Result=600;
否则如果(@Count<250)
设置@Result=1000;
否则如果(@Count<500)
设置@Result=1700;
否则如果(@Count<1000)
设置@Result=2600;
否则如果(@Count<2000)
设置@Result=4000;

现在,这只是一个猜测。这可能不是您想要的,但是,我在不了解您的应用程序的情况下这么说,这似乎更可能是您希望实现的目标。

我不知道您可以将函数作为存储过程执行。尝试使用
select dbo.fn\u Get\u Price For_Circulation(…
)。我想函数不能直接调用。它们必须是select语句的一部分。我会将commandType更改为Text,并将其称为“select fn\u Get\u Price\u For_Circulation”,方法与在MSSQL资源管理器中相同。使用
select[dbo].[fn\u Get\u Price\u For_Circulation]..
即使您正确地调用它,它仍然可以返回NULL,因为只有在@TypeID=9和@Count in(50100、250、500、1000、2000)的情况下,您的变量才会被设置为一个值。如果不满足上述极为精确的条件,则返回值将为NULL。这是唯一的示例代码吗?我想知道为什么要使用sql函数来做一些在c#中更容易完成的事情?此代码仅是sql函数的一部分。Thx寻求帮助!
if @Count < 50
    set @Result = 400;
else if (@Count < 100)
    set @Result = 600;
else if (@Count < 250)
    set @Result = 1000;
else if (@Count < 500)
    set @Result = 1700;
else if (@Count < 1000)
    set @Result = 2600;
else if (@Count < 2000)
    set @Result = 4000;