2017-10-08 43 views
0

讓我先發布我的代碼開始:的ExecuteScalar沒有返回正確的價值觀C#

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

    }   
} 

Execute方法:

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

     } 

    } 

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

現在我的問題是當我撥打ExecuteScalar()

由於某種原因,我的ExecuteScalar總是返回0作爲結果,並不能因爲我測試它作爲一個普通的查詢在PSQL殼和它總是返回值> 0當我調用合法查詢,必須返回正常值。

第一次通話後進入ExecuteScalar,從蘭巴符返回returnValue和例如其16,那麼當它去執行功能,不知何故,返回0,我不明白爲什麼,怎麼把主要的東西,我需要ExecuteScalar爲將返回count(*)的值作爲int

+2

請檢查c.ExecuteScalar的返回值。如果這不是預期的類型,則返回默認值(T)(在本例中爲default(int)),該值計算爲零(即使SQL語句返回另一個值)。 –

+0

@RalfBönning你可以將這個問題作爲一個答案給出一個你想要說什麼的例子,如果我在'default'或'returnValue'上把'T'改成'int',我必須改變整個類型的方法爲int '爲了工作的方法 –

+0

只要刪除'是T'測試。如果劇組失敗,則應拋出異常......但是,作爲一種特殊情況,你應該沒問題(你沒有得到你期望的類型)。你的數據庫提供者可能會返回一個'short'或者'long'或者'BigInteger',或許它會返回一個包含整數的'float' ......這些都不會是T,例如'int'所以測試失敗並返回整數類型爲零的缺省值(T)。 – pinkfloydx33

回答

2

你能告訴我們你怎麼叫ExecuteScalar? T是什麼類型?此外,將斷點設置爲:var returnValue = c.ExecuteScalar();並檢查在跳過該行(F10)後返回的類型。在Visual Studio的監視窗口中,您應該檢查Type列。