2017-10-08 14 views
0
を返さない

は私が最初に私のコードを投稿してみましょうは、ExecuteScalarは正しい値C#

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

    }   
} 

Executeメソッド:

:ExecuteScalarメソッドの

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

     } 

    } 

コール

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(); 

今、私の問題はExecuteScalar()に電話するときです。

何かの理由で私のExecuteScalarは常に結果として0を返し、それはcozできませんPSQLシェルで通常のクエリとしてテストしました。通常の値を返さなければならないlegitクエリを呼び出すと、常に値> 0が返されます。

それは主なものだって私がExecuteScalarを必要とし、それが機能を実行するために行くときに、どういうわけか、それは0を返し、私は理由を理解しない、呼び出しの後ExecuteScalarに入るラムダのオペレーターからreturnValueを返し、例えばその16初回にcount(*)の値をintとして返すことです。

+2

c.ExecuteScalarの戻り値を確認してください。これが期待される型でない場合は、デフォルト(T)(この場合はデフォルト(int))が返されます。これは、SQL文が別の値を返す場合でもゼロに評価されます。 –

+0

@RalfBönningは、あなたが答えようとしているものを答えとして投稿することができますか?私が 'default'または' returnValue'で 'T'を' int'に変更すると、 'メソッドが動作するために –

+0

' is T'テストを削除するだけです。キャストが失敗した場合は、例外をスローする必要があります...しかし、それは例外的な状況として(あなたが期待しているタイプを取得していない)OKです。 dbプロバイダが 'short'や' long'や 'BigInteger'を返しているかもしれません。たぶん、整数を含む' float'を返すかもしれません... Tのどれも、 'int'テストは失敗し、整数型のゼロがゼロのデフォルト(T)が返されます。 – pinkfloydx33

答えて

2

ExecuteScalarの呼び出し方法を教えてください。 Tはどんなタイプですか?また、ブレークポイントをvar returnValue = c.ExecuteScalar();に設定し、その行を踏み越えた後に返されるタイプを確認します(F10)。 Visual Studioのウォッチウィンドウで、[タイプ]列をチェックしてください。

関連する問題