2017-10-09 158 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; 
    } 
}