Как заставить окно сообщения появиться, если происходит DBNULL - PullRequest
1 голос
/ 26 апреля 2019

У меня проблема в том, что если я ищу данные через TextBox, а данные не существуют в базе данных, я получаю ошибку

'Объект не может быть приведен из DBNull к другим типам.'

Я пытаюсь заставить MessageBox сказать, что данные не существуют и не могу понять, как это сделать.

Я попытался использовать оператор if, где, если TextBox равно DBNull, то появляется MessageBox. t work and im not too sure why. The error occurs with me trying to **equal** to DBNull . How do i produce a TextBox` это говорит, что данные не существуют?

{
        SqlConnection con = new SqlConnection("***COnString**");
        con.Open();
        SqlCommand comm = new SqlCommand("SELECT SUM (Total_Hours_Day) FROM Sign_In_Out_Table, User_Table WHERE User_Table.FirstName = '" + Search_Username_Alerts_Admin_txtbox.Text + "' AND Sign_In_Out_Table.eb_number = User_Table.eb_number AND Date between GETDATE()-14 and GETDATE()", con);
        decimal TotalHoursFortnight = Convert.ToDecimal(comm.ExecuteScalar());
        con.Close();

        decimal sum = 0;

        sum += Convert.ToDecimal(TotalHoursFortnight);

        if (Search_Username_Alerts_Admin_txtbox.Text == DBNull)
        {
            MessageBox.Show("No Data Exists");
        }
        else
        {
            MessageBox.Show(Search_Username_Alerts_Admin_txtbox.Text + ":" + Environment.NewLine + " Hours Worked = " + TotalHoursFortnight, ("Working Info Admin"), MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
}

Мой ожидаемый результат для появившегося окна сообщения о том, что данные не найдены, если их искать. но если это произойдет, данные отобразятся в окне сообщения.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

У вас есть 3 кейсов для реализации:

  1. Нет данные вообще: проверьте на null
  2. Неверные данные, например, 1 + 2 + NULL + 3 == NULL: проверьте для DBNull.Value
  3. Действительные данные, например, 1 + 2 + 3 == 6: преобразовать его с помощью Convert.ToDecimal()

Код:

// wrap IDisposable into using
using (SqlConnection con = new SqlConnection("***COnString**")) {
  con.Open();

  //DONE: Make sql readable
  //DONE: Make sql parametrized
  //TODO: you may want to change eb_number = eb_number into INNER JOIN
  string sql = 
    @"SELECT SUM (Total_Hours_Day) 
        FROM Sign_In_Out_Table, 
             User_Table 
       WHERE User_Table.FirstName = @prm_FirstName  
         AND Sign_In_Out_Table.eb_number = User_Table.eb_number 
         AND Date BETWEEN GETDATE() - 14 AND GETDATE()"; 

  using (SqlCommand comm = new SqlCommand(sql, con)) {
    //TODO: Better specify RDBMS type explictly with "comm.Parameters.Add(...)"
    comm.Parameters.AddWithValue(
      "@prm_FirstName", Search_Username_Alerts_Admin_txtbox.Text); 

    var result = comm.ExecuteScalar();

    if (null == result) {              // No Data
      MessageBox.Show("No Data Exist");
    }
    else if (DBNull.Value == result) { // We have the Data and it's RDBMS Null
      MessageBox.Show("Data Exist, but not valid.");
    } 
    else {                             // We have a valid Decimal
      Decimal sum = Convert.ToDecimal(result); 
      //TODO: put the relevant code here
    }
  }
}
1 голос
/ 26 апреля 2019

Я бы использовал decimal.tryparse, чтобы увидеть, были ли возвращены данные

            SqlConnection con = new SqlConnection("***COnString**");
            con.Open();
            SqlCommand comm = new SqlCommand("SELECT SUM (Total_Hours_Day) FROM Sign_In_Out_Table, User_Table WHERE User_Table.FirstName = '" + Search_Username_Alerts_Admin_txtbox.Text + "' AND Sign_In_Out_Table.eb_number = User_Table.eb_number AND Date between GETDATE()-14 and GETDATE()", con);
            string TotalHoursFortnight = (comm.ExecuteScalar()).ToString();
            con.Close();

            decimal sum = 0;
            decimal temp;
            if(!decimal.TryParse(TotalHoursFortnight, out temp)) 
            { 

                MessageBox.Show("No Data Exists");
            }
            else
            {
                sum += temp;

                MessageBox.Show(Search_Username_Alerts_Admin_txtbox.Text + ":" + Environment.NewLine + " Hours Worked = " + TotalHoursFortnight, ("Working Info Admin"), MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
0 голосов
/ 26 апреля 2019

Вам нужно проверить ноль для результата запроса

var result = comm.ExecuteScalar();
    if(result != null){
         decimal TotalHoursFortnight = Convert.ToDecimal(comm.ExecuteScalar());
         // move remain code to if block
    }

И if (Search_Username_Alerts_Admin_txtbox.Text == DBNull) должно измениться на

if (Convert.IsDBNull(Search_Username_Alerts_Admin_txtbox.Text){

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...