Преобразование типа данных Varchar в результирующую дату и время вне диапазона - PullRequest
0 голосов
/ 07 июля 2011

У меня проблема. Я могу определить свою ошибку ...

int dt = Convert.ToInt32(Items.Rows[T1]["F14"].ToString().Trim());
int mn = Convert.ToInt32(Items.Rows[T1]["F15"].ToString().Trim());
int yr = Convert.ToInt32(Items.Rows[T1]["F16"].ToString().Trim());
string DtString = mn.ToString().Trim() + "/" + dt.ToString().Trim() + "/" + yr.ToString().Trim();
DateTime RegExp = Convert.ToDateTime(DtString);

exp_date is datetime field in sqlserver.

string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";

Но я получаю ошибку:

Преобразование типа данных Varchar в результирующее значение даты и времени вне допустимого диапазона

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Ну, я бы подошел к задаче совсем по-другому:

  • После получения дня, месяца и года в виде целых чисел я определенно не стал бы склеивать ихи разобрать их.Просто используйте:

    // Note the meaningful variable names here, btw...
    DateTime date = new DateTime(year, month, day);
    
  • При обновлении базы данных, я не будет вставлять значение непосредственно в оператор SQL.Вместо этого используйте параметризованный оператор SQL и установите для параметра значение date.Таким образом, вам не нужно беспокоиться о том, что база данных ожидает формат даты, отличный от того, который вы предоставляете.В общем, вы должны всегда использовать параметризованный SQL, а не встраивать значения непосредственно в SQL - а также помогать в подобных ситуациях, это позволяет избежать атак внедрения SQL.

Теперь, после того, как сделает все это, если вы все еще получаете ошибку, вы должны проверить, какие фактические данные вы пытаетесь вставить.Возможно, данные в Items на самом деле вне диапазона для SQL Server.

2 голосов
/ 07 июля 2011

Трудно увидеть точно , так как вы не показываете свои входные данные; однако следующее явно опасно:

DateTime RegExp = Convert.ToDateTime(DtString);

string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";

Даже если мы замаскируем тот факт, что вы должны использовать параметры (вам действительно следует), вам нужно будет отформатировать эту дату так, как ожидает SQL-сервер - что может сильно отличаться от локального формата.

Тем не менее, не надо форматировать его! Используйте параметр для этого, и он уйдет. Это не должно быть сложно - например, с более щадящим :

DateTime RegExp = new DateTime(yr, mn, dt);

connection.Execute("UPDATE MyTable SET exp_date=@exp where MyTable.id_no=@id",
    new { exp = RegExp, id = AlmIDNo });

и готово; полностью безопасен как для внедрения, так и (более вероятно, в этом случае) проблемы форматирования данных в виде строк.

1 голос
/ 07 июля 2011

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

...