2017-10-08 7 views
0

Permettez-moi de commencer par l'affichage de mon premier code:ExecuteScalar ne pas retourner les valeurs de droite C#

méthode ExecuteScalar:

public T ExecuteScalar<T>(string sql, CommandType commandType, List<NpgsqlParameter> parameters) 
{ 
    using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji")) 
    { 
     return Execute<T>(sql, commandType, c => 
     { 
      var returnValue = c.ExecuteScalar(); 
      return (returnValue != null && returnValue != DBNull.Value && returnValue is T) 
      ? (T)returnValue 
      : default(T); 
     }, parameters); 

    }   
} 

méthode d'exécution:

T Execute<T>(string sql, CommandType commandType, Func<NpgsqlCommand, T> function, List<NpgsqlParameter> parameters) 
    { 
     using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji")) 
     { 
      using (var cmd = new NpgsqlCommand(sql, conn)) 
      { 
       cmd.CommandType = commandType; 
       if (parameters.Count > 0) 
       { 
        foreach (var parameter in parameters) 
        { 
         cmd.Parameters.AddWithValue(parameter.ParameterName,parameter.Value); 
        } 
       } 
       return function(cmd); 
      } 

     } 

    } 

Appel de la méthode ExecuteScalar:

komanda = "begin;select count(*) from radni_sati where [email protected] and [email protected]" + 
         " and (dolazak is not null and odlazak is not null and sati_rada is not null) and napomena='' ;commit;"; 
      listaParametara.Add(new NpgsqlParameter { ParameterName = "@ime", Value = ime }); 
      listaParametara.Add(new NpgsqlParameter { ParameterName = "@prezime", Value = prezime }); 
      var nePrazni_redovi=instanca.ExecuteScalar<int>(komanda, CommandType.Text, listaParametara); 
      listaParametara.Clear(); 

Maintenant, mon problème est quand j'appelle ExecuteScalar(). Pour une raison quelconque, mon ExecuteScalar renvoie toujours 0 comme résultat et cela ne peut pas être parce que je l'ai testé comme une requête normale dans PSQL Shell et il renvoie toujours les valeurs> 0 lorsque j'appelle la requête légitime qui doit retourner la valeur normale.

Première Il entre dans ExecuteScalar après un appel, retourne un returnValue de l'opérateur lamba et par exemple son 16, puis quand il va exécuter la fonction, en quelque sorte, il retourne 0 et je ne comprends pas pourquoi, coz principale chose que je dois ExecuteScalar pour est de retourner la valeur count(*) comme int.

+2

Veuillez vérifier la valeur de retour de c.ExecuteScalar. Si ce n'est pas le type attendu, la valeur par défaut (T) (dans ce cas, default (int)) est retournée, ce qui donne zéro (même si l'instruction SQL renvoie une autre valeur). –

+0

@ RalfBönning pourriez-vous afficher cela comme une réponse avec un exemple de ce que vous essayez de dire, coz si je change 'T' en' int' sur 'default' ou' returnValue' je dois changer le type entier de méthode en 'int 'pour que la méthode fonctionne –

+0

Supprimez simplement le test' is T'. Si le casting échoue, une exception devrait être lancée ... Mais cela devrait être OK comme une circonstance exceptionnelle (vous n'obtenez pas le type que vous attendez). Votre fournisseur db pourrait renvoyer un 'short' ou un' long' ou un 'BigInteger', peut-être qu'il retourne un' float' contenant un nombre entier ... rien de ce qui serait T, par exemple, un 'int' donc le test échoue et retourne default (T) qui pour les types entiers est nul. – pinkfloydx33

Répondre

2

pouvez-vous nous dire comment ça s'appelle ExecuteScalar? Quel type est T? En outre, définissez le point d'arrêt sur: var returnValue = c.ExecuteScalar(); et vérifiez quel type est renvoyé après avoir passé cette ligne (F10). Dans la fenêtre de surveillance de Visual Studio, vous devez cocher la colonne Type.