Как я могу получить даты начала и окончания с LIKE% C # - PullRequest
0 голосов
/ 05 марта 2019

Каков правильный синтаксис даты между like?Это мой пример кода.Я получаю сообщение об ошибке

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    MySqlDataAdapter sda = new MySqlDataAdapter(
        "SELECT `empID`, `Name`, `Date`, `empIn`, `empOut`, `workhours`, `workhoursTotal`, `workhoursLate`, `workhoursLateTotal`, `overtime`, `minuteOvertime`, `Reason`, `undertime`, `undertimeTotalMin`, `status`, `Payslip` FROM `attendance`"
        + " WHERE  Date BETWEEN LIKE '" 
        + dateTimePicker1.Value.ToString("yyyy-MM-dd") 
        + "%' AND Date LIKE'" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "%'", con);

    DataTable data = new DataTable();
    sda.Fill(data);
    dataGridView1.DataSource = data;
}

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Если вы конвертируете значения DateTime в строки для использования в SQL, вы делаете что-то ОЧЕНЬ НЕПРАВИЛЬНО .Используйте параметризованные запросы, чтобы позволить ADO.Net обрабатывать это для вас.В качестве бонуса это защитит вас от атак SQL-инъекций и, в целом, будет работать лучше.

Кроме того, вообще не имеет смысла использовать LIKE с BETWEEN.В этом отношении само по себе BETWEEN часто является плохой практикой для сравнения дат, потому что оно включительно на обоих концах диапазона.Лучше всего сравнивать, где дата >= с началом диапазона, и < (без =) первого момента следующего дня в конце диапазона.

Похоже, вы пытаетесь повторно использовать один и тот же объект соединения в приложении или форме. Не делайте этого. ADO.Net имеет функцию, называемую пул соединений, которая будет обрабатывать это для вас более эффективным способом.Вы действительно хотите создать новый объект подключения для большинства запросов.

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    var result = new DataTable();
    string sql = @"
        SELECT `empID`, `Name`, `Date`, `empIn`, `empOut`, `workhours`, `workhoursTotal`, 
           `workhoursLate`, `workhoursLateTotal`, `overtime`, `minuteOvertime`, `Reason`, 
           `undertime`, `undertimeTotalMin`, `status`, `Payslip` 
        FROM `attendance`
        WHERE `Date` > @StartDate AND `Date` <= @EndDate";

    using (var con = new MySqlConnection("connection string here"))
    using (var cmd = new MySqlCommand(sql, con))
    using (var sda = new MySqlDataAdapter(cmd))
    {
        cmd.Parameters.Add("@StartDate", MySqlDbType.DateTime).Value =  dateTimePicker1.Value.Date;
        cmd.Parameters.Add("@StartDate", MySqlDbType.DateTime).Value =  dateTimePicker2.Value.Date.AddDays(1);

        sda.Fill(result);
    }
    dataGridView1.DataSource = result;
}
0 голосов
/ 05 марта 2019

Прежде всего, вы уверены, что ваш dateTimePicker имеет информацию? Не рекомендуется отправлять значение непосредственно в базу данных. Во-вторых, в коде много ошибок:

MySqlDataAdapter sda = new MySqlDataAdapter("SELECTempID,Name,Date,empIn,empOut,workhours,workhoursTotal,workhoursLate,workhoursLateTotal,overtime,minuteOvertime,Reason,undertime,undertimeTotalMin,status,PayslipFROMattendance` WHERE Date BETWEEN LIKE '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "%' AND Date LIKE'" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "%'", con);

Существует пробел после SELECT, до и после FROM, в последнем лайке, пожалуйста, проверьте ваш код в MySQL, а затем скопируйте его в c #. Должно выглядеть так:

    MySqlDataAdapter sda = new MySqlDataAdapter("SELECT empID, Name, Date, empIn, empOut, workhours, workhoursTotal, workhoursLate, workhoursLateTotal, overtime, minuteOvertime, Reason, undertime, undertimeTotalMin, status, Payslip 
FROM Mattendance WHERE Date BETWEEN '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' AND '" + dateTimePicker2.Value.ToString("yyyy-MM-dd") + "' ", con);

Возможно, есть больше синтаксических ошибок, но вы можете проверить их самим.

В-третьих, нет смысла использовать «Like» с datetime, поэтому просто используйте BETWEEN.

И, наконец, используйте это в datetime, чтобы избежать проблем с форматированием.

dateTimePicker1.Value.ToString(CultureInfo.InvariantCulture)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...