0

我在 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();
4

4 回答 4

2

当你调用一个函数时,你必须满足它的返回值。

c# dore1 的代码

    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 datetime 格式不处理 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
于 2013-08-17T12:36:39.683 回答
1

因为你正在处理日期。确保在将它们发送到 SQL 之前对其进行转换。

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

并确保您在 SQL 语句中接收日期而不是 nvarchar(50)。

于 2013-08-17T12:39:59.060 回答
1

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

查看有关 procs 和函数之间的差异 http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

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

于 2013-08-17T12:37:40.497 回答
0

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

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

完毕

于 2013-08-17T21:20:24.750 回答