修改
删除assetItem上的对象初始化程序似乎解决了我的问题,但为什么?
结束编辑
我似乎无法找到从我的数据库中读取INT的方法,因为它将其转换为emun。
我已经尝试了两者中的建议 Cast int to enum in C# 和How to (efficiently) convert (cast?) a SqlDataReader field to its corresponding 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
(枚举)?
答案 0 :(得分:1)
你缺少reader.IsDBNull(3),所以它可能试图将DbNull强制转换为int,这是无效的。
如果您确定该列中没有空值,那么请确保您从数据库中获取的内容是一个int,您可以通过将内容作为字符串来实现;或者将它保留为对象,设置断点,并在IDE调用值中使用即时窗口.GetType()将告诉您究竟要处理的是什么。
如果你将枚举存储为db中的字符串,那么你应该使用Enum.Parse()
答案 1 :(得分:1)
尝试按如下方式声明枚举,这应该允许它从整数正确地转换为正确的枚举值。
public enum Test : int
{
TestValue1 = 1,
TestValue2 = 2,
TestValue3 = 3
}
答案 2 :(得分: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
}
}
}
答案 3 :(得分:0)
仔细检查列的数据类型,枚举可以存储为tinyint。 How can you convert "tinyint" of t-sql to integer in c#?
尝试在转换之前将值读入变量,以验证错误不是读数。