7

これはだまされている可能性があることは理解していますが、答えを探すのに何時間も費やしましたが、見つけられないようです.

現在、コンサート データを取得する Web API を作成しています。

開始日と終了日をどちらもdatetime2タイプとして保持する SQL Server テーブルがあります。この形式で日付を挿入しましたが、データベースを表示するときに問題は発生しません。

2015-10-08T20:00:00.0000000+01:00

私のモデル:

public class Concert
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LocationId { get; set; }

    [Column(TypeName = "DateTime2")]
    public DateTime Start { get; set; }

    [Column(TypeName = "DateTime2")]
    public DateTime End { get; set; }

    public string Description { get; set; }
    public string Url { get; set; }
}

そして、データベース データを表示するクラスのメソッド:

    public List<Concert> getAll() 
    {
        List<Concert> concerts = new List<Concert>();

        SqlConnection connection = CasWebAPIdb.getConnection();
        String selectAll = "SELECT ConcertId, ConcertName, ConcertLocationId FROM dbo.Concerts";
        SqlCommand selectCommand = new SqlCommand(selectAll, connection);

        try
        {
            connection.Open();
            SqlDataReader reader = selectCommand.ExecuteReader();
            var isoDateTimeFormat = CultureInfo.InvariantCulture.DateTimeFormat;

            while (reader.Read())
            {
                //Debug.WriteLine("lol: " + reader["ConcertEnd"].GetType());

                Concert concert = new Concert();

                concert.Id = (int)reader["ConcertId"];
                concert.Name = reader["ConcertName"].ToString();
                concert.LocationId = (int)reader["ConcertLocationId"];
                concert.Start = (DateTime)reader["ConcertStart"];
                concert.End = (DateTime)reader["ConcertEnd"];

                concerts.Add(concert);
            }
        }
        catch (SqlException ex)
        {
            throw ex;
        }
        finally
        {
            connection.Close();
        }
        return concerts;
    }
}

デバッグ時に次のエラーが発生します。

タイプ 'System.IndexOutOfRangeException' の例外が System.Data.dll で発生しましたが、ユーザー コードで処理されませんでした

私は多くのことを試し、多くの例とコードに従いましたが、これを適切に変換できないようです。誰かアイデアがありますか?

解決

「concertStart」と「concertEnd」をクエリに追加するのを忘れていました。問題は解決しました、ありがとう!

4

4 に答える 4

1

問題は、select で、必要な列のうち 3 つだけを返すことです。

 String selectAll = "SELECT ConcertId, ConcertName, ConcertLocationId ...";

一方、リーダーでは、5 つの列をスクレイピングしようとします。

concert.Id = (int)reader["ConcertId"];
concert.Name = reader["ConcertName"].ToString();
concert.LocationId = (int)reader["ConcertLocationId"];
concert.Start = (DateTime)reader["ConcertStart"];
concert.End = (DateTime)reader["ConcertEnd"];

したがって、IndexOutOfRangeException. すべての列を選択するか、不要な列をリーダーから削除してください。

この問題は SqlDateTime2と .Netとは関係ありません。ADO はこれらを問題なくDateTimeバインドします。

于 2015-02-28T10:51:10.450 に答える