2017-04-19 4 views
1

ストアドプロシージャをSSMSから実行すると、明らかに問題の列に1が表示されます(ADOではtrue)私の中間にいるときは、DataReaderは常にfalseを返します。私はこれがbit私のSELECTステートメントで値をキャストしている可能性がありますが、私はステートメントをちょうどCAST(1 AS BIT)に変更する場合、DataReaderはすべて正確にtrueと読むので、キャスティングではありません。ですので、ここで、ADO.NET - SQLビット値 "1"がDataReaderによって "false"として読み取られ続けています

Func<IDataRecord, ResponseModel> searchReader = delegate (IDataRecord record) 
{ 
    var model = new ResponseModel(); 
    model.BooleanProperty = record.GetBoolean(0);  
    return model; 
}; 

誰かがコードを囲むために尋ねた:ここに続いて

SELECT CASE 
    WHEN receiptid IS NULL THEN CAST(0 AS BIT) 
    ELSE CAST(1 AS BIT) 
END [WasAdjusted] 
FROM dbo.MyTable 

UNION ALL 

SELECT CONVERT(BIT, 0) [WasAdjusted] 
FROM dbo.MySecondTable 

私のADO.NET C#コードです:[このため@MikhailLobanovへの帽子先端]

は、ここに私のSQLスクリプトです私DataReader

protected static List<TReturnType> ExecuteReader<TReturnType>(string connectionString, string storedProcName, Func<IDataRecord, TReturnType> delegateFunction, List<SqlParameter> collection = null) 
{ 
    List<TReturnType> results = null; 

    try 
    { 
     using (SqlConnection connect = new SqlConnection(connectionString)) 
     { 
      connect.Open(); 

      SqlCommand command = new SqlCommand(storedProcName, connect); 
      command.CommandTimeout = 1000; 
      command.CommandType = CommandType.StoredProcedure; 

      if (collection != null) 
      { 
       collection.ForEach(x => command.Parameters.Add(x)); 
      } 

      using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection)) 
      { 
       while (reader.Read()) 
       { 
        if (results == null) 
        { 
         results = new List<TReturnType>(); 
        } 

        results.Add(delegateFunction((IDataRecord)reader)); 
       } 

       reader.Close(); 
      } 

      connect.Dispose(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 

    return results; 
} 

次に、あなたがそうのようにこれを呼び出します。

return ExecuteReader(_connectionString, "dbo.NameOfStoredProc", searchReader, sqlParams); 

私には何が欠けていますか?ありがとう。

編集2017年4月25日には:他の誰かが同じ問題を持つかもしれないように見えます:https://github.com/AutoMapper/AutoMapper.Data/issues/12

+0

カラムに名前を付ける必要がありますか(カラムに別名を付ける)でしょうか? – Shnugo

+0

@ Shnugo私の列(FWIW)の名前は 'WasAdjusted'です。私は 'record.GetBoolean(record.GetOrdinal(" WasAdjusted "))'を実行しようとしましたが、それは私に同じ結果をもたらします。私は質問を表示するように更新します。 – codeMonkey

+1

なぜあなたはビットとしていくつかの価値をキャストすべきですか?あなたはちょうど 'T'/'F'のようないくつかのものを返すのではなく、record.GetString(0) –

答えて

2

ストアドプロシージャを実行しているユーザーが同じ/等しいアクセス許可を持っていることを確認します。 Appユーザー(IDataReaderを実行中)がSSMSへのログインに個人的に使用しているアカウントとは異なる権限を持つ可能性があります。その場合、同じストアドプロシージャは2つの異なる結果セットを提供します。

0

IDataRecord.GetBoolean方法は、値がすでにブール値であることを期待しています。それはそれを変換しようとしません。次のコードを使用してブール値を取得することができます。 Convert.ToBoolean(record.GetValue(record.GetOrdinal("WasAdjusted")))

+0

問題は 'record.GetValue(record.GetOrdinal(" WasAdjusted "))'は真でなければならないときに 'false'を返し、真偽を認識できないというわけではありません。 – codeMonkey

関連する問題