【问题标题】:SQL function returns Wrong in c#SQL函数在c#中返回错误
【发布时间】:2013-08-17 12:29:16
【问题描述】:

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

【问题讨论】:

  • 检查来自文本框的值是否正确传递并且可以转换为日期时间数据类型。例如2013-08-17 11:40:59.0

标签: c# function mysql-management executescalar


【解决方案1】:

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

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 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

【讨论】:

  • 我的函数是正确的并且在 SQL 管理中运行。我认为 c# 有一个错误。我测试了你的建议,但没有用
  • 我并不是说你的函数在 SMSS 中不起作用,我是说你的存储过程不适用于 c#。
  • 您能否展示您如何从 ssms 调用 dore1 以及您在 txt_1_aghaz.Texttxt_1_payan.Text 中有哪些值
  • 1392/01/09 和 1392/02/30 有我的价值。当我写 Select @tedad 我的函数将不会创建并显示 SELECT 错误
  • 再见这段代码:SqlCommand Cmd = new SqlCommand("Select dbo.dore1(@First, @Second)", cnn);
【解决方案2】:

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

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

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

【讨论】:

  • 你的意思是在我的功能中?我的函数在 SQL 管理中工作并返回正确的值。但在这一行 dore1=Convert.ToInt32(Cmd.ExecuteScalar());它返回 0 而不是返回值 2(例如)
  • 是的,但它正在返回一个不同的值。执行标量期望 SELECT 具有单行/单列结果。
【解决方案3】:

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

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

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

【讨论】:

  • 当我在那里运行我的函数时,它与 SQL 中的 Char 一起工作(我们的日期与 Gerogrian 日期不同)
  • 我的参数不是 DATE 。它是 char,它与 sql 中的 char 一起使用
【解决方案4】:

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

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

完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多