2017-10-09 132 views
0

我有一个函数和一个检查记录的过程是否存在于数据库中或不存在。当记录存在且0不存在时,假设得到1。我执行我的程序它可以正常工作,但在Visual Studio不干活找不到问题 这里是我的程序ExecuteScalar返回0值

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

“ExecuteScholar”听起来像一些真正的野蛮,反教育行为 – maccettura

+0

你应该小心'AddWithValue',正是在这种特殊情况下正常,但在哪里[它可以使你不使用索引的情况下,在你的数据库中,如果它选择了错误的类型](https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/),最好使用'添加'并传入一个类型。 –

回答

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