SQL函数在c#中返回Wrong

本文关键字:返回 Wrong 函数 SQL | 更新日期: 2023-09-27 18:27:58

我在SQL中有一个函数,它在SQL管理中执行时返回正确答案这是我的功能

ALTER FUNCTION [dbo].[Dore1] 
    (@First NVARCHAR(50), @second NVARCHAR(50))
RETURNS INT
AS
BEGIN
    DECLARE @Tedad INT
    SET @tedad = (SELECT COUNT(sh_gharardad)
                  FROM OrgGharardad
                  WHERE OrgGhAghdDate BETWEEN @First
                  AND @second)
    RETURN @Tedad
END

但当我在c#程序中使用它时,它在该代码中返回0(零)值。我哪里写错了?

int dore1, dore2;
        ConnectDb Contact = new ConnectDb();
        Contact.connect();
        SqlCommand Cmd = new SqlCommand("dore1", cnn);
        SqlCommand Cmd2 = new SqlCommand("dore2", cnn);
        Cmd.CommandType = CommandType.StoredProcedure;
        Cmd2.CommandType = CommandType.StoredProcedure;
        cnn.Open();
        Cmd.Parameters.AddWithValue("@First", txt_1_aghaz.Text);
        Cmd.Parameters.AddWithValue("@Second", txt_1_payan.Text);
        dore1=Convert.ToInt32( Cmd.ExecuteScalar());

        Cmd2.Parameters.AddWithValue("@First2", txt_2_aghaz.Text);
        Cmd2.Parameters.AddWithValue("@second2", txt_2_payan.Text);
        dore2= Convert.ToInt32( Cmd2.ExecuteScalar());
        CreateChart(dore1, dore2);
        cnn.Close();

SQL函数在c#中返回Wrong

在调用函数时,必须考虑其返回值。

dore1的c#代码

    int dore1;
    ConnectDb Contact = new ConnectDb();
    Contact.connect();
    SqlCommand Cmd = new SqlCommand("dore1", cnn);
    Cmd.CommandType = CommandType.StoredProcedure;
    cnn.Open();
    Cmd.Parameters.AddWithValue("@First", txt_1_aghaz.Text);
    Cmd.Parameters.AddWithValue("@Second", txt_1_payan.Text);
    // setup out parm
    var outParm =  Cmd.Parameters.Add("@Tedad");
    outParm.Direction = ParameterDirection.ReturnValue;
    Cmd.ExecuteScalar();
    // this is safe as long as select count() returns a number
    dore1 = (Int32) outParm.Value;

T-SQL函数

您有一个特定的日期格式,最接近的是日本格式yyyy/mm/dd,代码为111。然而,1392年是一个较低的年份。这些值在你的表中吗?sql日期时间格式不处理1753之前的日期。如果没有存储日期,则可以删除convert语句并恢复到原始的tsql函数。

ALTER FUNCTION [dbo].[Dore1] 
    (@First NVARCHAR(50), @second NVARCHAR(50))
RETURNS INT
AS
BEGIN
    DECLARE @Tedad INT
    SET @Tedad = (SELECT COUNT(sh_gharardad)
                  FROM OrgGharardad
                  WHERE OrgGhAghdDate 
                      BETWEEN CONVERT(datetime, @First , 111)
                      AND CONVERT(datetime, @second, 111))
    RETURN @Tedad
END

ExecuteScalar需要一个1列1行的结果集,而不是函数返回的结果集。在标量结果中实际得到的是受影响行的COUNT值。

看看这个关于proc和函数之间的区别http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

您需要做一些事情来选择函数的结果,以便执行标量。

因为您使用的是日期。请确保在将它们发送到SQL之前对其进行转换。

Convert.ToDateTime(txt_1_aghaz.Text.ToString())

并确保您在SQL语句中收到的是Dates,而不是nvarchar(50)。

it通过此更改完成:SqlCommand Cmd=new SqlCommand("选择dbo.dore1(@First,@Second)",cnn);

我们不能直接调用函数,它不是存储过程

完成