Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.

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

Что я здесь делаю не так??

Пожалуйста помоги.

P

            private void buttonRetrieveData_Click(object sender, EventArgs e)
    {
        openConnection();

        //TODO: Add function te retrieve data between dates enteren in datetimepickers
        DateTime datumVan = dateTimePickerVan.Value;

        DateTime datumTot = dateTimePickerTot.Value;

        string query = "select * from my_Table where date between '" + datumVan.ToShortDateString() + "' and '" + datumTot.ToShortDateString() + "' order by date desc";

        DataSet dset = new DataSet();
        SqlDataAdapter adapter = new SqlDataAdapter(query, connection);

        SqlCommandBuilder cb = new SqlCommandBuilder(adapter);

        adapter.Fill(dset, "my_Table");

        dataGridView1.DataSource = dset;
        dataGridView1.DataMember = "my_table";

        adapter.Update(dset, "my_Table");

        closeConnection();
    }

person Predo    schedule 19.09.2012    source источник


Ответы (3)


Не рассматривайте даты как строки. Это так просто, прежде всего избегайте преобразования их в строки, и вы избавите себя от кучи неприятностей.

Итак, вместо:

string query = "select * from my_Table where date between '" + datumVan.ToShortDateString() + "' and '" + datumTot.ToShortDateString() + "' order by date desc";

Имейте вместо этого:

string query = "select * from my_Table where date between @Van and @Tot order by date desc";

А затем добавьте параметры к объекту команды:

adapter.SelectCommand.Parameters.AddWithValue("@Van",datumVan);
adapter.SelectCommand.Parameters.AddWithValue("@Tot",datumTot);

Позвольте ADO.Net и SQL Server решить проблему преобразования значений даты и времени .NET в значения даты и времени SQL Server.

person Damien_The_Unbeliever    schedule 19.09.2012

Я знаю, что тип даты и времени SQL имеет диапазон дат: с 1 января 1753 года по 31 декабря 9999 года.

И минимальное значение даты и времени .NET равно 00:00:00.0000000, 1 января 0001 года.

Я бы порекомендовал вам проверить, что вы не попадаете между диапазонами.

Это означает, что если ваш сборщик даты и времени не инициирован со значением SQL min, он может вернуть недопустимую дату SQL.

person AMember    schedule 19.09.2012
comment
Я бы также рекомендовал использовать параметры в ваших операторах SQL, а не напрямую вставлять значения в запрос. - person AMember; 19.09.2012

Я столкнулся с похожей проблемой, но мое решение было простым:

Вместо

+ datumVan.ToShortDateString() + "' and '" + datumTot.ToShortDateString() +

я изменился на

+ datumTot.ToShortDateString() + "' and '" + datumVan.ToShortDateString() +   

Попробуйте, если это поможет.

Кроме того, ваша дата преобразуется в строку с помощью ToShortDateString(), но какой формат у вашей даты в таблице??

Может быть, вы также можете попробовать следующий запрос:

выберите * из my_Table, где CAST(дата КАК ДАТА) между CAST('" + ToShortDateString() + "' КАК ДАТА) и CAST('" + datumTot.ToShortDateString() + "' КАК ДАТА) порядок по дате desc";

person RMN    schedule 19.09.2012