2013-11-12 4 views
0

Я пытаюсь вырезать ошибку в своем веб-приложении. В основном я пытаюсь реализовать систему бронирования ресторанов. Пользователь выбирает, сколько людей на вечеринке, сидя (обед или ужин) и дату. Затем система запрашивает мою базу данных, чтобы сообщить пользователю, есть ли доступность. Он работает, если в ресторане уже заказано несколько человек, но если запрос возвращает значение NULL (т. Е. Ресторан пуст), система выйдет из строя. Мне никогда не приходилось иметь дело с NULL перед тем, как это сделать, и я не понимаю, как справиться с этой ошибкой в ​​коде, чтобы пользователь мог сделать заказ. Я прокомментировал свой код как можно лучше. Любая помощь очень ценится! :)Ошибка базы данных при возврате нулевого значения

protected void AvailabilityButton_Click(object sender, EventArgs e) 
{ 
    //Create SQL Database connection 
    // New sql connection and command 
    SqlConnection myconn = new SqlConnection(); 
    myconn.ConnectionString = "Data Source=STUDENT2;Initial Catalog=HarryBistro;Integrated Security=True"; 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = myconn; 
    myconn.Open(); 

    //Check that selected date is today or later 
    if (Calendar1.SelectedDate <= DateTime.Today) 
    { 
     SuccessFailureLabel.Text = "Please select a date in the future"; 
     SuccessFailureLabel.Visible = true; 
    } 
    else 
    { 
     //Create variables from user input 
     string SelectedBranch = BranchDropDownList.SelectedValue.ToString(); 
     string SelectedSitting = SittingDropDownList.SelectedValue.ToString(); 
     int SelectedDiners = Convert.ToInt32(DinersDropDownList.SelectedValue); 
     string SelectedDate = Calendar1.SelectedDate.ToString("yyyy-MM-dd"); 


     //Query to find out how many people have already booked into selected restaurant on selected date on selected sitting 
     cmd.CommandText = "select SUM(Number_Of_Seats) from RESERVATIONS where Sitting = '" + SelectedSitting + "' and Branch_ID = '" + SelectedBranch + "' and Date_Of_Booking = '" + SelectedDate + "' "; 

     //Assign the value of the people in the restaurant to a variable 
     int peopleinrestaurant = (int)cmd.ExecuteScalar(); 

     //Query to find out how many people the selected restaurant seats 
     cmd.CommandText = "select SUM(Capacity) from BRANCH where Branch_ID = '" + SelectedBranch + "'"; 

     //Assign the value of the people in the restaurant to a variable 
     int branchCapacity = (int)cmd.ExecuteScalar(); 

     //add the amount of people in the party to the restaurant occupancy and assign to a variable 
     int totalOccupancy = peopleinrestaurant + SelectedDiners; 

     if (totalOccupancy <= branchCapacity) 
     { 
      //Show success message 
      SuccessFailureLabel.Visible = true; 
      SuccessFailureLabel.Text = "Booking available. Please proceed."; 

      //enable customer details text boxes so the customer can proceed     
      ConfirmBookingButton.Enabled = true; 
     } 

     else 
     { 
      //Show failure message if booking over capacity. Show user how many seats are available 
      SuccessFailureLabel.Visible = true; 
      SuccessFailureLabel.Text = "Cannot proceed. There are only " + (branchCapacity - peopleinrestaurant) + " seats available."; 
     } 
    } 
} 
+0

Где yuo получить сообщение об ошибке? На первый взгляд кажется, что ваши люди в ресторане должны иметь значение 0, если нет заказов, а не null. При этом вы можете проверить, является ли объект NULL простым с if (object == null). – oerkelens

+0

'ExecuteScalar' может возвращать значение null, которое нельзя передать в' int'. Перед литьем вы должны проверить его возвращаемое значение. –

+0

Я стою исправлены. SUM() _does_ возвращает null, если записи не найдены. – oerkelens

ответ

4

Вы должны проверить значение null, прежде чем вводить значение в int.

//Assign the value of the people in the restaurant to a variable 
var obj = cmd.ExecuteScalar(); 

int peopleinrestaurant = obj != null ? (int)obj : 0; 
1

вы можете проверить, если возвращение нулевой или не используя

isnull(your query,replacement_value) 
1

Вы должны обрабатывать NULL значения конкретно. NULL не равен 0, поэтому вы не можете выполнять вычисления с ним. Существует несколько способов работы с NULL, но один из способов, который хорош, если вы хотите работать с числами, - это добавить ISNULL() в sql-запрос.

SUM(ISNULL(NumberOfSeats,0)) 

Однако, как было сказано, SUM() не должны возвращать NULL и должен игнорировать NULLs, так что я не думаю, что ваш вопрос находится в том самом месте.

+0

SUM() _does_ return NULL, если никакие записи не выбраны для суммирования. Я просто протестировал его и был удивлен :) – oerkelens

1

В этом случае, самое простое решение, вероятно, не ваши запросы возвращают NULL:

select COALESCE(SUM(Number_Of_Seats), 0) from RESERVATIONS where ... 
+0

+1 для использования COALESCE. Это ключевое слово заслуживает большего внимания. После простого теста я обнаружил, что SUM() _does_ return NULL Если нет никаких сумм, то это действительно хороший ответ (и лучший на мой взгляд :)) – oerkelens

+0

Преимущество COALESCE в том, что он работает (почти ?) все базы данных (например, Oracle имеет NVL вместо ISNULL) и что вы можете иметь несколько аргументов (возвращается первое значение, отличное от NULL). Предполагая, что MS Sql Server как база данных, ISNULL работает так же хорошо. – Sam

0

изменения

int peopleinrestaurant = (int)cmd.ExecuteScalar(); 

в

int peopleinrestaurant = cmd.ExecuteScalar() == null ? 0 : (int)cmd.ExecuteScalar(); 

Ваш запрос возврат нулевого значения и оценка m не находится в запросе, а в вашей обработке данных в C#.

+0

Таким образом, вы выполняете команду дважды, лучше назначить результат команды объекту один раз, а затем проверить, является ли это нулевым или нет. Я все еще не уверен, почему SUM() вернет NULL, хотя ... – oerkelens

Смежные вопросы