Как исправить, что Input не был в правильном формате в разделе reader.Read (), когда возвращаются строки?

0

Я столкнулся с проблемой в модуле reader.Read() моего кода, говорит, что ввод был не в правильном формате, но возвращена строка, так как reader.HasRows возвращает true..

Я также искал в Google об этом и узнал, что конверсия может быть проблемой. Тем не менее, это не может быть проблемой для меня, так как код работал раньше, и теперь я сталкиваюсь с этим.

Как это возможно? В чем может быть проблема? Заранее спасибо..

Вот трассировка стека:
StackTrace "в System.Number.StringToNumber(String str, параметры NumberStyles, NumberBuffer & number, информация NumberFormatInfo, логическое значение parseDecimal)\r\n в System.Number.ParseInt32 (строка String, стиль NumberStyles, информация NumberFormatInfo)\r\n в MySql.Data.Types.MySqlInt32.\r\n в MySql.Data.MySqlClient.ResultSet.ReadColumnData(Boolean outputParms)\r\n в MySql.Data.MySqlClient.ResultSet.NextRow (поведение CommandBehavior)\r\n в MySql.Lata.LaD.Lata.()\r\n в строке System.Data.Common.DbEnumerator.MoveNext()\r\n в строке System.Linq.SystemCore_EnumerableDebugView.get_Items() "

Вот мой код:

class ControlDB
    {
        MySqlConnection connection;
        MySqlDataAdapter adapter;
        MySqlCommand command;
        DataTable dataTable;
        MySqlDataReader reader;

        private string server;
        private string database;
        private string userid;
        private string password;

        public ControlDB()
        {
            ConnectDB();
        }
        public void ConnectDB()
        {
            server = "localhost";
            database = "YBHDB";
            userid = "root";
            password = "";

            string connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + userid + ";" + "PASSWORD=" + password + ";";
            connection = new MySqlConnection(connectionString);
            connection.Open();
        }
 public string[] GetCustomer(string arrivalDate, string arrivalTime, string departureDate, string departureTime, string roomId)
        {
            string[] customer = new string[20];
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append("SELECT c.FirstName, c.MiddleName, c.LastName, c.Address, c.Nationality, c.ContactNumber, c.Email, c.CustomerID, rc.RoomId, rc.RCID, rc.ArrivalDate, rc.DepartureDate, rc.ArrivalTime, rc.DepartureTime, rc.DaysOfStay, rc.NumberOfAdult, rc.NumberOfChildren, rc.PaymentType, rc.CardType, rc.CardNumber ");
            stringBuilder.Append("FROM customer c JOIN reservationcheckin rc ON ");
            stringBuilder.Append("c.CustomerId = rc.CustomerID ");
            stringBuilder.Append("WHERE ((concat(rc.ArrivalDate, ' ', rc.ArrivalTime) BETWEEN concat(@arrivalDT, ' ', @arrivalTM) AND concat(@departureDT, ' ', @departureTM) ");
            stringBuilder.Append("OR concat(rc.DepartureDate, ' ', rc.DepartureTime) BETWEEN concat(@arrivalDT, ' ', @arrivalTM) AND concat(@departureDT, ' ', @departureTM)) ");
            stringBuilder.Append("OR (concat(@arrivalDT, ' ', @arrivalTM) BETWEEN concat(rc.ArrivalDate, ' ', rc.ArrivalTime) AND concat(rc.DepartureDate, ' ', rc.DepartureTime) ");
            stringBuilder.Append("OR concat(@departureDT, ' ', @departureTM) BETWEEN concat(rc.ArrivalDate, ' ', rc.ArrivalTime)  AND concat(rc.DepartureDate, ' ', rc.DepartureTime)) ) ");
            stringBuilder.Append("AND rc.RoomId = @roomId");



            command = new MySqlCommand();
            command.Connection = connection;
            command.CommandText = stringBuilder.ToString();


            MySqlParameter arrivalDateParameter = new MySqlParameter("@arrivalDT", Convert.ToDateTime(arrivalDate).Date.ToString("yyyy-MM-dd"));
            MySqlParameter arrivalTimeParameter = new MySqlParameter("@arrivalTM", (Convert.ToDateTime(arrivalTime).TimeOfDay).ToString().Replace('{', ' ').Trim());
            MySqlParameter departureDateParameter = new MySqlParameter("@departureDT", Convert.ToDateTime(departureDate).Date.ToString("yyyy-MM-dd"));
            MySqlParameter departureTimeParameter = new MySqlParameter("@departureTM", (Convert.ToDateTime(departureTime).TimeOfDay).ToString().Replace('{', ' ').Trim());
            MySqlParameter roomParameter = new MySqlParameter("@roomId", Convert.ToInt32(roomId));


            command.Parameters.Add(arrivalDateParameter);
            command.Parameters.Add(arrivalTimeParameter);
            command.Parameters.Add(departureDateParameter);
            command.Parameters.Add(departureTimeParameter);
            command.Parameters.Add(roomParameter);

           reader = command.ExecuteReader();

            if(reader.HasRows)
            {
                reader.Read();
                customer[0] = reader["FirstName"].ToString();
                customer[1] = reader["MiddleName"].ToString();
                customer[2] = reader["LastName"].ToString();
                customer[3] = reader["Address"].ToString();
                customer[4] = reader["Nationality"].ToString();
                customer[5] = reader["ContactNumber"].ToString();
                customer[6] = reader["Email"].ToString();
                customer[7] = reader["RoomID"].ToString();
                customer[8] = reader["ArrivalDate"].ToString();
                customer[9] = reader["ArrivalTime"].ToString();
                customer[10] = reader["DepartureDate"].ToString();
                customer[11] = reader["DepartureTime"].ToString();
                customer[12] = reader["DaysOfStay"].ToString();
                customer[13] = reader["NumberOfAdult"].ToString();
                customer[14] = reader["NumberOfChildren"].ToString();
                customer[15] = reader["PaymentType"].ToString();
                customer[16] = reader["CardType"].ToString();
                customer[17] = reader["CardNumber"].ToString();
                customer[18] = reader["CustomerID"].ToString();
                customer[19] = reader["RCID"].ToString();
            }
            reader.Close();

            return customer;
        }
}

Вот метод, который вызывает GetCustomer():

   private void buttons_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;

            string[] customer = new string[20];

            string roomId = button.Text.Split(' ')[1];

            customer = control.GetCustomer(arrivalDatePicker.Value.ToShortDateString(), arrivalTimePicker.Value.ToShortTimeString(), departureDatePicker.Value.ToShortDateString(), departureTimePicker.Value.ToShortTimeString(), roomId);

            firstNameText.Text = customer[0];
            middleNameText.Text = customer[1];
            lastNameText.Text = customer[2];
            addressText.Text = customer[3];
            nationalityText.Text = customer[4];
            contactText.Text = customer[5];
            emailText.Text = customer[6];
            roomNo.Text = customer[7];
            arrivalDatePicker.Text = customer[8];
            arrivalTimePicker.Text = customer[9];
            departureDatePicker.Text = customer[10];
            departureTimePicker.Text = customer[11];
            daysStay.Text = customer[12];
            numAdultText.Text = customer[13];
            numChildText.Text = customer[14];
            paymentTypeSelect.Text = customer[15];
            cardTypeSelect.Text = customer[16];
            cardNumberText.Text = customer[17];
            customerID = Convert.ToInt32(customer[18]);
            roomID = Convert.ToInt32(customer[7]);
            rcid = Convert.ToInt32(customer[19]);
        }
  • 0
    На какой строке кода происходит сбой? Можете ли вы опубликовать строку кода и полную трассировку стека исключений? Кроме того, вместо проверки HasRows, вы можете просто сделать некоторое время (reader.Read ()) {.... читать вашего клиента здесь ....}. Я также рекомендую использовать класс Customer со всеми этими свойствами вместо использования массива из 20 строк. Это сделает ваш код намного чище и удобнее в обслуживании.
  • 0
    @Jon Привет, Джон, я опубликовал трассировку стека .. Код падает на сам ридер. Read ()
Показать ещё 10 комментариев
Теги:
datareader

1 ответ

0

После расследования код обнаружил ошибку во временной части. Тип данных прибывающего и уходящего времени в SQL - это время, и когда читатель читает строки, возникает проблема. Поэтому я просто изменил свой тип данных на varchar. Надеюсь, это не вызовет ошибок в будущем. Хх

Ещё вопросы

Сообщество Overcoder
Наверх
Меню