1

I try to save the SQL Results in a array and return it back. but i'm getting an exception: array out of range error.

here is my code:

 public BookingUpdate[] getBookingUpdates(string token)
{
    String command = "SELECT b.ID,b.VERANSTALTER, rr.VON ,rr.BIS, b.THEMA, b.STORNO, ra.BEZEICHNUNG from BUCHUNG b JOIN RESERVIERUNGRAUM rr on rr.BUCHUNG_ID = b.ID JOIN RAUM ra on ra.ID = rr.RAUM_ID WHERE b.UPDATE_DATE BETWEEN DATEADD (DAY , -20 , getdate()) AND getdate() AND b.BOOKVERNR = 0";
    SqlConnection connection = new SqlConnection(GetConnectionString());
    BookingUpdate[] bookingupdate = new BookingUpdate[1];
    connection.Open();
    try
    {
        SqlCommand cmd = new SqlCommand(command, connection);
        SqlDataReader rdr = null;
        int count = 0;
        rdr = cmd.ExecuteReader();


            while (rdr.Read())
            {
                DataTable dt = new DataTable();
                dt.Load(rdr);
                count = dt.Rows.Count;
                for (int c = 0; c < count; c++)
                {
                    bookingupdate = new BookingUpdate[c];
                    bookingupdate[c].bookingID = (long)rdr["ID"]; // <---- Error is here
                    bookingupdate[c].fullUserName = rdr["VERANSTALTER"].ToString();
                    bookingupdate[c].newStart = (DateTime)rdr["VON"];
                    bookingupdate[c].newStart = (DateTime)rdr["BIS"];
                    bookingupdate[c].newSubject = rdr["THEMA"].ToString();
                    bookingupdate[c].newlocation = rdr["BEZEICHNUNG"].ToString();
                    if (rdr["STORNO"].ToString() != null)
                    {
                        bookingupdate[c].deleted = true;
                    }
                    else
                    {
                        bookingupdate[c].deleted = false;
                    }

                }

            }

    }

    catch (Exception ex)
    {
        log.Error(ex.Message + "\n\rStackTrace:\n\r" + ex.StackTrace);
    }
    finally
    {
        connection.Close();
    }
    return bookingupdate;
}

What am i missing?

9 Answers 9

2
bookingupdate = new BookingUpdate[c];
bookingupdate[c].bookingID = (long)rdr["ID"]; 

you are creating an Array of length c, which means it has the Indexes 0 to (c-1) - and then you are out of bounds, when trying to store at Position c.

Sign up to request clarification or add additional context in comments.

Comments

1

You appear to be creating and allocating memory for an array with

bookingupdate = new BookingUpdate[c];

but not actually creating instances of BookingUpdate. When you attempt to set properties on your array element there is no actual BookingUpdate to update - there is only a holder for one.

I'd suggest changing your code to something along the lines of:

...
bookingupdate = new BookingUpdate[count];  // allocates space for the number of BookingUpdates to be created
for (int c = 0; c < count; c++)
{
    bookingupdate[c] = new BookingUpdate(); // create a new instance of BookingUpdate and assign it the array     
    bookingupdate[c].bookingID = (long)rdr["ID"];
    ...

I hope that this helps!

Comments

1

Imho i would simplify your way to construct that array with Linq:

BookingUpdate[] bookingupdate = dt.AsEnumerable()
    .Select(r => new BookingUpdate{
        bookingID = r.Field<long>("ID"),
        fullUserName = r.Field<string>("VERANSTALTER"),
        newStart = r.Field<DateTime>("Von"),
        newEnd = r.Field<DateTime>("Bis"), // here was another bug in your originalcode
        newSubject = r.Field<string>("THEMA"),
        newlocation = r.Field<string>("BEZEICHNUNG"),
        deleted = r.Field<string>("STORNO") != null
    })
    .ToArray();

On this way you will not have problems with arrays that are out of bounds.

Comments

0

You accessing the n'th element of an n-Elements array which is out of range, you need to access the n - 1 element.

bookingupdate = new BookingUpdate[c];   // You create an array of 5 elements for example 
bookingupdate[c].bookingID = (long)rdr["ID"]; // Here you access the 5th elements but there are only 4

Comments

0

the problem is related with the size of the array;

 for (int c = 0; c < count; c++)
 {
    bookingupdate = new BookingUpdate[c];
    bookingupdate[c].bookingID = (long)rdr["ID"];

in the previous code, you are creating an array (bookingupdate ) of size 0 at first; then you are trying to insert an item. Even if you somehow manage to skip first one, it will again fail. Just update these lines to the following;

bookingupdate = new BookingUpdate[count];
for (int c = 0; c < count; c++)
     {        
        bookingupdate[c].bookingID = (long)rdr["ID"];

Comments

0
            for (int c = 0; c < count; c++)
            {
                bookingupdate = new BookingUpdate[c];

Error is at first iteration of this for loop where c is zero. ie, you are trying to create a array of length zero. bookingupdate = new BookingUpdate[0];

Comments

0

You have initialized an array but not the class itself before calling it. Also your initialization is wrong

count = dt.Rows.Count;
bookingupdate = new BookingUpdate[count];
for (int c = 0; c < count; c++)
{
    bu = new BookingUpdate();
    bu.bookingID = (long)rdr["ID"]; // <---- Error is here
    bu.fullUserName = rdr["VERANSTALTER"].ToString();
    bu.newStart = (DateTime)rdr["VON"];
    bu.newStart = (DateTime)rdr["BIS"];
    bu.newSubject = rdr["THEMA"].ToString();
    bu.newlocation = rdr["BEZEICHNUNG"].ToString();
    if (rdr["STORNO"].ToString() != null)
    {
        bu.deleted = true;
    }
    else
    {
        bu.deleted = false;
    }
    bookingupdate[c] = bu;
}

Comments

0

Arrays has zero based index.

When you create bookingupdate = new BookingUpdate[c]; your last index would c-1.

You can't access BookingUpdate[c] because it is not exist.

Let's say c = 4, that means we definedan array with 4 elements which they are;

BookingUpdate[0]
BookingUpdate[1]
BookingUpdate[2]
BookingUpdate[3]

BookingUpdate[c] would equal BookingUpdate[4] which there is no such an index.

From MSDN page;

Arrays are zero indexed: an array with n elements is indexed from 0 to n-1.

Comments

0

Use this code

public BookingUpdate[] getBookingUpdates(string token)
{
String command = "SELECT b.ID,b.VERANSTALTER, rr.VON ,rr.BIS, b.THEMA, b.STORNO, ra.BEZEICHNUNG from BUCHUNG b JOIN RESERVIERUNGRAUM rr on rr.BUCHUNG_ID = b.ID JOIN RAUM ra on ra.ID = rr.RAUM_ID WHERE b.UPDATE_DATE BETWEEN DATEADD (DAY , -20 , getdate()) AND getdate() AND b.BOOKVERNR = 0";
BookingUpdate[] bookingupdate;
SqlConnection connection = new SqlConnection(GetConnectionString());

connection.Open();
try
{
    SqlCommand cmd = new SqlCommand(command, connection);
    SqlDataReader rdr = null;
    int count = 0;
    rdr = cmd.ExecuteReader();


        while (rdr.Read())
        {
            DataTable dt = new DataTable();
            dt.Load(rdr);
            count = dt.Rows.Count;
            bookingupdate = new BookingUpdate[count];
            for (int c = 0; c < count; c++)
            {
                bookingupdate[c].bookingID = (long)rdr["ID"]; // <---- Error is here
                bookingupdate[c].fullUserName = rdr["VERANSTALTER"].ToString();
                bookingupdate[c].newStart = (DateTime)rdr["VON"];
                bookingupdate[c].newStart = (DateTime)rdr["BIS"];
                bookingupdate[c].newSubject = rdr["THEMA"].ToString();
                bookingupdate[c].newlocation = rdr["BEZEICHNUNG"].ToString();
                if (rdr["STORNO"].ToString() != null)
                {
                    bookingupdate[c].deleted = true;
                }
                else
                {
                    bookingupdate[c].deleted = false;
                }

            }

        }

}

catch (Exception ex)
{
    log.Error(ex.Message + "\n\rStackTrace:\n\r" + ex.StackTrace);
}
finally
{
    connection.Close();
}
return bookingupdate;

}

1 Comment

i cant return bookingupdate : the name bookingupdate doenst exist in current context

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.