2017-10-09 9 views
0

J'ai une fonction et une procédure qui vérifie qu'un enregistrement existe dans la base de données ou non. Cela suppose d'obtenir 1 quand l'enregistrement existe et 0 n'existe pas. J'exécuté mon procédure fonctionne correctement, mais en studio visuel n'a pas work.I n'a pas pu trouver le problème voici ma procédureExecuteScalar return 0 valeur

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 

et ci-dessous est ma fonction:

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

et je vérifier avec cela si statment sous forme principale

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

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

« ExecuteScholar » sonne comme une action anti-véritable éducation barbare, – maccettura

+0

Vous devez être prudent avec 'AddWithValue', il est très bien dans ce cas précis, mais il y a des situations où [il peut vous causer de ne pas utiliser les index dans votre base de données s'il choisit le mauvais type] (https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/), il est préférable d'utiliser 'Ajouter' et transmettre un type. –

Répondre

0

C'est parce que vous devez choisir quelque chose, de sorte que le ExecuteScalar peut récupérer le premier élément de votre ensemble de lignes. Modifiez votre SP et faites SELECT au lieu de RETURN. Quelque chose comme ceci:

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

Pour utiliser la valeur de retour de la procédure, vous devez créer un paramètre que vous lierez à la direction ReturnValue.

De plus, vous devriez vraiment établir la connexion locale à la fonction et la mettre au rebut en utilisant une instruction 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; 
    } 
}