ExecuteScalar返回0值

时间:2017-10-09 15:55:04

标签: c# ado.net

我有一个函数和一个程序来检查数据库中是否存在记录。当记录存在且0不存在时,假设得到1。我执行了我的程序它工作正常,但在视觉工作室没有工作。我找不到问题 这是我的程序

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

我查看主要表格中的陈述

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

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

2 个答案:

答案 0 :(得分:0)

那是因为你应该选择一些东西,所以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

答案 1 :(得分:0)

要使用您需要创建参数的过程的返回值,请绑定到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;
    }
}