簡體   English   中英

SQL函數在c#中返回錯誤

[英]SQL function returns Wrong in c#

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

當你調用一個函數時,你必須滿足它的返回值。

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

ExecuteScalar 需要 1 列 1 行的結果集,這不是函數返回的結果。 您在標量結果中實際得到的是受影響行的 COUNT 值。

查看有關 procs 和函數之間的差異http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

你需要做一些事情來選擇函數的結果,以便執行標量工作。

因為你正在處理日期。 確保在將它們發送到 SQL 之前對其進行轉換。

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

並確保您在 SQL 語句中接收日期而不是 nvarchar(50)。

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

我們不能直接調用函數,它不是存儲過程

完畢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM