ADO.NET - DataReader仍将SQL位值“1”读为“false”

时间:2017-04-19 00:48:23

标签: c# sql-server ado.net sqldatareader

如果我从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

2 个答案:

答案 0 :(得分:2)

确保执行存储过程的用户具有相同/相同的权限。应用程序用户(执行IDataReader)可能具有与您个人用于登录SSMS的帐户不同的权限,在这种情况下,相同的存储过程将提供两个不同的结果集。 / p>

答案 1 :(得分:0)

IDataRecord.GetBoolean方法期望该值已经是布尔值。它不会尝试转换它。您可以使用以下代码来获取布尔值: Convert.ToBoolean(record.GetValue(record.GetOrdinal("WasAdjusted")))