【问题标题】:ExecuteScalar return 0 valueExecuteScalar 返回 0 值
【发布时间】:2017-10-09 15:55:03
【问题描述】:

我有一个函数和一个检查记录是否存在于数据库中的过程。它假设当记录存在时得到 1 而不存在时得到 0。我执行了我的程序它工作正常,但在 Visual Studio 中不起作用。我找不到问题 这是我的程序

Create PROCEDURE [dbo].[checkRepititiveModel]
@modelName nvarchar(50)
as
If EXISTS ( SELECT * FROM  models WHERE modelName = @modelName)
begin 
return 1
end
Else 
begin 
return 0
end

以下是我的功能:

 public int CheckRepetitive(string connectionString,string modelName)
        {
            SqlCon = new SqlConnection(connectionString);
            if (SqlCon.State != ConnectionState.Open)
            {
                SqlCon.Open();
            }
            SqlCommand com = new SqlCommand("checkRepititiveModel", SqlCon);
            com.Parameters.AddWithValue("@modelName", modelName);
            com.CommandType = CommandType.StoredProcedure;
            int result = Convert.ToInt32(com.ExecuteScalar());
            if (SqlCon.State != ConnectionState.Closed)
            {
                SqlCon.Close();
            }
            return result;
        }

我检查一下主表单中的 if 语句

int a = Db.CheckRepetitive(ConStr, txtBxModelName.Text);
            if (a > 0)
            {

                MessageBox.Show(a.ToString() + " exist!!");
                return;
            }

【问题讨论】:

标签: c# ado.net


【解决方案1】:

那是因为你应该选择一些东西,所以 ExecuteScalar 可以检索你的行集的第一个元素。更改您的 SP 并执行 SELECT 而不是 RETURN。像这样的:

ALTER PROCEDURE [dbo].[checkRepititiveModel]
  @modelName nvarchar(50)
AS
BEGIN
  IF EXISTS (SELECT 1 FROM  Catalogo.Maquina WHERE Codigo = @modelName)
      SELECT 1
  ELSE 
    SELECT 0
END

【讨论】:

    【解决方案2】:

    要使用过程的返回值,您需要创建一个绑定到ReturnValue 方向的参数。

    此外,您确实应该在函数本地建立连接并使用using 语句处理它。

     public int CheckRepetitive(string connectionString,string modelName)
     {
        using(var sqlCon = new SqlConnection(connectionString))
        {
            sqlCon.Open();
    
            SqlCommand com = new SqlCommand("checkRepititiveModel", sqlCon);
            com.Parameters.Add("@modelName", SqlDbType.NVarChar).Value = modelName;
    
            SqlParameter retval = sqlcomm.Parameters.Add("@rc", SqlDbType.Int);
            retval.Direction = ParameterDirection.ReturnValue;
    
            com.CommandType = CommandType.StoredProcedure;
            com.ExecuteNonQuery();
    
            return (int)retval.Value;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2023-03-14
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多