2

編集

assetItem のオブジェクト初期化子を削除すると、問題が解決したように見えますが、なぜですか?

編集終了

データベースからINTをemunにキャストして読み取る方法を理解できないようです。

Cast int to enum in C#SqlDataReader フィールドを対応する c# 型に (効率的に) 変換 (キャスト?) する方法の両方で提案を試みました か? 成功せずに。

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

}

EncodePresetsForSmoothStreaming序数 3 (int) を(enum)としてキャストするにはどうすればよいですか?

4

4 に答える 4

1

そこに Reader.IsDBNull(3) がなかったので、DbNull を int にキャストしようとしている可能性がありますが、これは無効です。

その列にnullがないことが確実な場合は、DBから取得しているものがintであることを確認してください。コンテンツを文字列として取得することでそれを行うことができます。または、オブジェクトのままにし、ブレークポイントを設定し、IDE 呼び出しで即時ウィンドウを使用して value.GetType() を使用すると、正確に何を扱っているかがわかります。

列挙型を文字列として db に格納する場合は、Enum.Parse() を使用する必要があります。

これも同様です:例外: 指定されたキャストは無効です

于 2013-05-02T22:26:28.843 に答える
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 に答える
0

列のデータ型を再確認してください。列挙型が tinyint として格納されている可能性があります。 c#でt-sqlの「tinyint」を整数に変換するにはどうすればよいですか?

エラーが読み取りではないことを確認するために、キャストする前に値を変数に読み取ろうとします。

于 2014-07-10T20:05:27.380 に答える