【问题标题】:Stored procedure not working on code存储过程不适用于代码
【发布时间】:2015-11-11 19:36:32
【问题描述】:

我有一个非常简单的存储过程,它返回给我一些输出变量。

如果我通过任何方法(Management Studio、Visual Studio Server Explorer)执行这个存储过程,它工作得很好。

问题是,如果我尝试在客户端使用 ExecuteNonQuery() 执行它,它不会执行存储过程,ExecuteNonQuery() 返回值 -1 并且没有输出。我想知道我是否应该使用ExecuteNonQuery() 以外的其他东西来执行此过程并获取这些输出变量。

这是我的存储过程:

CREATE PROCEDURE [dbo].ChekEmail
    @Email varchar(50),
    @Id int output,
    @Flag_User int output
AS
    SET @Id = 0
    SET @Id = (SELECT Client.Id FROM Client WHERE Client.Email = @Email)

    IF(@Id > 0)
    BEGIN 
        SET @Flag_User = 1
        RETURN @Id
    END
    ELSE
    BEGIN 
        SET @Id = (SELECT Clinic.Id FROM Clinic WHERE Clinic.Email = @Email)

        IF(@Id > 0)
        BEGIN 
            SET @Flag_User = 2
            RETURN @Id
        END
    END

这就是我执行它的地方

public int CheckEmail(string Email)
{
    Conection con = new Conection();

    SqlCommand cmd = new SqlCommand("ChekEmail");
    cmd.Connection = con.connect();

    cmd.Parameters.AddWithValue("@Email", Email);
    cmd.Parameters.Add("@Id", SqlDbType.Int).Direction = ParameterDirection.Output;
    cmd.Parameters.Add("@Flag_User", SqlDbType.Int).Direction = ParameterDirection.Output;

    cmd.CommandType = CommandType.StoredProcedure;

    int x = cmd.ExecuteNonQuery();

    if (x >= 0)
    {
        int Id_Owner = Convert.ToInt32(cmd.Parameters["@Id"].Value.ToString());
        int Flag_User = Convert.ToInt32(cmd.Parameters["@Flag_User"].Value.ToString());

        if (Flag_User == 1)
        {
            return Id_Owner;
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 0;
    }
}

【问题讨论】:

  • “不起作用”?有什么症状。
  • “它不起作用”不是对问题的解释。
  • 不执行存储过程,ExecuteNonQuery()返回值-1,没有输出。

标签: c# sql .net stored-procedures


【解决方案1】:

您可以在 MSDN 页面上阅读 ExecuteNonQuery 为 SELECT 查询返回 -1 是记录在案的行为

对于 UPDATE、INSERT 和 DELETE 语句,返回值为 受命令影响的行数。当触发器存在于 正在插入或更新的表,返回值包括数字 受插入或更新操作和数量影响的行数 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1

但这并不意味着你的存储过程没有被执行。简单地说,当前存储过程中受影响的行不会返回,因为您不使用所需的命令之一,而只是使用 SELECT。
不要将RETURN @Id 误认为ExecuteNonQuery 返回的值。您应该在 ExecuteNonQuery 调用之后删除 if

您也可以将存储过程更改为

CREATE PROCEDURE [dbo].ChekEmail
    @Email varchar(50),
    @Id int output,
    @Flag_User int output
AS
    SET @Id = 0
    SELECT @Id = Client.Id FROM Client WHERE Client.Email = @Email
    IF(@Id >0 )
    BEGIN 
        SET @Flag_User = 1
        RETURN @Id
    END
    ELSE
    BEGIN 
        SELECT @Id = Clinic.Id FROM Clinic WHERE Clinic.Email = @Email
        IF(@Id >0 )
        BEGIN 
            SET @Flag_User = 2
            RETURN @Id
        END
    END

在这个更新的存储过程中,我使用非标准 SELECT 将查询结果分配给 @ID 参数。这个变化的原因在this Answer中有很好的解释(否则你需要检查@Id参数中返回的NULL值)

如果你想读取RETURN @Id,你需要在你的查询中添加另一个参数,标记为ParameterDirection.ReturnValue

 cmd.Parameters.Add("@result", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
 ....

 int result = Convert.ToInt32(cmd.Parameters["@result"].Value.ToString());

【讨论】:

  • 我试过了。我收到一条带有消息的“System.FormatException”:“输入字符串的格式不正确。”
  • 还是不行,我不能得到任何输出变量也不能返回值
  • 您现在收到错误了吗?如果没有,您是否在 Sql Server Management Studio 中尝试使用相同参数的相同查询?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2011-01-23
  • 1970-01-01
  • 2021-09-04
  • 2011-09-16
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多