#c# #mysql #datareader
#c# #mysql #datareader
Вопрос:
Я сталкиваюсь с проблемой в части reader.Read() моего кода, в которой говорится, что ввод был не в правильном формате, но есть строка, возвращенная с момента чтения.HasRows возвращает true ..
Я также искал в Google об этом и узнал, что проблемой может быть преобразование. Однако это может быть не проблемой для меня, поскольку код работал раньше, и теперь я сталкиваюсь с этим.
Как это возможно? В чем может быть проблема? Заранее спасибо..
Вот трассировка стека:
StackTrace » в System.Number.StringToNumber(String str, параметры NumberStyles, NumberBufferamp; number, информация NumberFormatInfo, логическое значение parseDecimal)r n в System.Number .ParseInt32(String s, стиль NumberStyles, информация NumberFormatInfo) r n в MySQL.Data.Типы.MySqlInt32.MySQL.Data.Типы.Значение imysql.Значение чтения (пакет MySqlPacket, длина Int64, логическое значение nullVal)r n в MySQL.Data.MySqlClient.NativeDriver.ReadColumnValue(индекс Int32, поле MySqlField, значение IMySqlValue valObject)r n в MySQL.Data.MySqlClient.ResultSet.ReadColumnData(Boolean outputParms)r n в MySQL.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)r n в MySQL.Data.MySqlClient.MySqlDataReader.Read() r n в System.Data.Обычный.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]);
}
Комментарии:
1. В какой строке кода происходит сбой? Можете ли вы опубликовать строку кода и полную трассировку стека исключений? Кроме того, вместо проверки HasRows вы можете просто сделать while (reader.Read()) { …. прочитайте ваш customer здесь …. }. Я также рекомендую использовать класс Customer со всеми этими свойствами вместо использования массива из 20 строк. Это сделает ваш код намного чище и удобнее в обслуживании.
2. @Jon Привет, Джон, я опубликовал трассировку стека.. Происходит сбой кода в самом reader.Read() ..
3. проверьте тип ваших параметров, это исключение преобразования типа
4. Эта трассировка стека отсутствует даже в вашем методе GetCustomer()? Вы вызываете reader.Read() из окна немедленной отладки или просмотра? Кроме того, ваши типы данных повсюду. Почему ваш метод Getcustomer() принимает roomId как строку, но преобразуется в int в вашем SQL-запросе? Почему ваши параметры даты являются строками и преобразуются в datetime, а затем обратно в string ?
5. Привет, @Jon, как ты смог узнать, что это не от GetCustomer()? Что касается даты и времени, текстовое поле возвращает строку, мне нужно получить только часть даты или времени каждого текстового поля .. поэтому я отформатировал его, используя строку..
Ответ №1:
После расследования код столкнулся с ошибкой во временной части. Типом данных ArrivalTime и departureTime в SQL является Time , и когда reader считывает строки, там возникает проблема. Итак, я просто изменил свой тип данных на varchar . Надеюсь, это не вызовет никаких ошибок в будущем .. xx