2

编辑

删除assetItem 上的对象初始化程序似乎已经解决了我的问题,但为什么呢?

结束编辑

我似乎无法想出一种方法来从我的数据库中读取一个 INT 并将其转换为 emun。

我已经尝试了 Cast int to enum in C#How to (efficient) convert (cast?) a SqlDataReader field to its对应的c# type中的建议?没有成功。

using (var connection = new SqlConnection(_sqlstring))
{
    using (var command = new SqlCommand("EXEC GetAllEncodedMedia", connection))
    {
        try
        {
            connection.Open();
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                if (reader.HasRows)
                {
                    var assetItem = new MediaServices.EncodedAssets
                    {
                        Id = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
                        PublishedName = reader.IsDBNull(1) ? null : reader.GetString(1),
                        PublishUri = reader.IsDBNull(2) ? new Uri("http://www.null.com") : new Uri(reader.GetString(2)),
                        EncodePreset = reader.IsDBNull(3) ? 0 : (MediaServices.EncodePresetsForSmoothStreaming)reader.GetInt32(3),
                        AssetId = reader.IsDBNull(4) ? null : reader.GetString(4),
                        EncoderJobId = reader.IsDBNull(5) ? 0 : reader.GetInt32(5),
                        //EncoderState = reader.IsDBNull(6) ? 0 : (JobState)reader.GetInt32(6),
                        //AssetState = reader.IsDBNull(7) ? 0 : (MediaServices.InternalAssetState)reader.GetInt32(7),
                        GroupId = reader.IsDBNull(8) ? 0 : reader.GetInt32(8),
                        Published = !reader.IsDBNull(2)
                    };
                    listReturn.Add(assetItem);
                }
            }
        }
        catch (Exception ex)
        {
            //error
        }

    }
}



[DataContract]
public enum EncodePresetsForSmoothStreaming
{
    [EnumMember]
    [Description("H264 Smooth Streaming 1080p")]
    H264SmoothStreaming1080P,
    [EnumMember]
    [Description("H264 Smooth Streaming 720p")]
    H264SmoothStreaming720P,
    [EnumMember]
    [Description("H264 Smooth Streaming 720p for 3G or 4G")]
    H264SmoothStreaming720Pfor3Gor4G,
    [EnumMember]
    [Description("H264 Smooth Streaming SD 16x9")]
    H264SmoothStreamingSd16X9,
    [EnumMember]
    [Description("H264 Smooth Streaming SD 4x3")]
    H264SmoothStreamingSd4X3

}

如何将序数 3 (int) 转换为EncodePresetsForSmoothStreaming(enum)?

4

4 回答 4

2

尝试如下声明您的枚举,这应该允许它正确地从整数转换为正确的枚举值。

public enum Test : int 
{ 
   TestValue1 = 1, 
   TestValue2 = 2, 
   TestValue3 = 3
}
于 2013-05-02T22:37:07.740 回答
1

将命令的类型更改为存储过程,并从命令文本中删除“EXEC”,以便命令文本只是存储过程名称:

using (var connection = new SqlConnection(_sqlstring))
{
    using (var command = new SqlCommand("GetAllEncodedMedia", connection))
    {
        try
        {
            connection.Open();
            command.CommandType = CommandType.StoredProcedure;
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                if (reader.HasRows)
                {
                    var assetItem = new MediaServices.EncodedAssets
                    {
                        Id = reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
                        PublishedName = reader.IsDBNull(1) ? null : reader.GetString(1),
                        PublishUri = reader.IsDBNull(2) ? new Uri("http://www.null.com") : new Uri(reader.GetString(2)),
                        EncodePreset = reader.IsDBNull(3) ? 0 : (MediaServices.EncodePresetsForSmoothStreaming)reader.GetInt32(3),
                        AssetId = reader.IsDBNull(4) ? null : reader.GetString(4),
                        EncoderJobId = reader.IsDBNull(5) ? 0 : reader.GetInt32(5),
                        //EncoderState = reader.IsDBNull(6) ? 0 : (JobState)reader.GetInt32(6),
                        //AssetState = reader.IsDBNull(7) ? 0 : (MediaServices.InternalAssetState)reader.GetInt32(7),
                        GroupId = reader.IsDBNull(8) ? 0 : reader.GetInt32(8),
                        Published = !reader.IsDBNull(2)
                    };
                    listReturn.Add(assetItem);
                }
            }
        }
        catch (Exception ex)
        {
            //error
        }
    }
}
于 2013-05-02T22:50:16.447 回答
1

你在那里缺少 reader.IsDBNull(3),所以它可能试图将 DbNull 转换为 int,这是无效的。

如果您确定该列中没有空值,那么请确保您从数据库中获得的是一个 int,您可以通过将内容作为字符串获取来做到这一点;或将其保留为对象,设置断点,并在您的 IDE 调用 value.GetType() 中使用即时窗口,这将告诉您到底在处理什么。

如果您将枚举作为字符串存储在数据库中,那么您应该使用 Enum.Parse()

这也是类似的:异常:指定的演员表无效

于 2013-05-02T22:26:28.843 回答
0

仔细检查列的数据类型,枚举可能存储为tinyint。 如何在 c# 中将 t-sql 的“tinyint”转换为整数?

在强制转换之前尝试将值读入变量以验证错误不是读数。

于 2014-07-10T20:05:27.380 回答