ストアドプロシージャを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
カラムに名前を付ける必要がありますか(カラムに別名を付ける)でしょうか? – Shnugo
@ Shnugo私の列(FWIW)の名前は 'WasAdjusted'です。私は 'record.GetBoolean(record.GetOrdinal(" WasAdjusted "))'を実行しようとしましたが、それは私に同じ結果をもたらします。私は質問を表示するように更新します。 – codeMonkey
なぜあなたはビットとしていくつかの価値をキャストすべきですか?あなたはちょうど 'T'/'F'のようないくつかのものを返すのではなく、record.GetString(0) –