如果我从SSMS运行我的存储过程,我可以清楚地看到相关列中的1
(应该在ADO中返回true
),但是在我的中间位置时{{1}总是返回DataReader
。我担心这可能是因为我在false
语句中将值转换为bit
,但如果我将SELECT
语句更改为CASE
CAST(1 AS BIT)
正确地读取所有内容为DataReader
,因此它不是转换。 [给他们提一下@MikhailLobanov]
这是我的SQL脚本:
true
然后这是我的ADO.NET C#代码:
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
有人询问了周围的代码,所以这是我的Func<IDataRecord, ResponseModel> searchReader = delegate (IDataRecord record)
{
var model = new ResponseModel();
model.BooleanProperty = record.GetBoolean(0);
return model;
};
:
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;
}
我错过了什么?感谢。
修改2017-04-25:看起来其他人可能遇到同样的问题:https://github.com/AutoMapper/AutoMapper.Data/issues/12
答案 0 :(得分:2)
确保执行存储过程的用户具有相同/相同的权限。应用程序用户(执行IDataReader
)可能具有与您个人用于登录SSMS的帐户不同的权限,在这种情况下,相同的存储过程将提供两个不同的结果集。 / p>
答案 1 :(得分:0)
IDataRecord.GetBoolean
方法期望该值已经是布尔值。它不会尝试转换它。您可以使用以下代码来获取布尔值:
Convert.ToBoolean(record.GetValue(record.GetOrdinal("WasAdjusted")))