2013-08-16 3 views
0

Я использую SQL Server 2012 и VS 2012. У меня есть таблица с следующими данными:UPDATE Переполнение DateTime запроса

TagID  SessionID  ScanningTime 
int  nvarchar   datetime 
--------------------------------------- 
4820427  Test1 2013-08-16 14:20:17.447 

я создал запрос UPDATE, чтобы сохранить любые изменения, которые были сделаны (любые записи добавлены или существующие записи отредактированы) в DGV обратно в SQL DB.

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

TagID  SessionID  ScanningTime 
int  nvarchar   datetime 
--------------------------------------- 
4820000  Test1  2013-08-16 14:20:17.447 
3242341  Test1  2013-08-16 14:20:17.447 

и нажмите на кнопку, чтобы обновить базу данных:

private void UpdateBtn_Click(object sender, EventArgs e) 
     { 
      DataTable queryResult = new DataTable(); 
      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 
       int tagID = Convert.ToInt32(row.Cells["TagID"].Value); 
       string sessionID = Convert.ToString(row.Cells["SessionID"].Value); 
       DateTime ScanningTime = Convert.ToDateTime(row.Cells["ScanningTime"].Value); 

      string ConnStr = "Data Source=DUZY;Initial Catalog=AutoRegSQL;Integrated Security=True"; 

      SqlConnection MyConn = new SqlConnection(ConnStr); 
      MyConn.Open(); 

      //SQL query that returns todays sessions for the given roomID 
      string query = @"UPDATE Attendance" + 
       " SET TagID= @tagNo, SessionID= @sessionNo, ScanningTime= @scantime "; 

      SqlCommand command = new SqlCommand(query, MyConn); 

      command.Parameters.Add("tagNo", SqlDbType.Int).Value = tagID; 
      command.Parameters.Add("sessionNo", SqlDbType.VarChar).Value = sessionID; 
      command.Parameters.Add("scantime", SqlDbType.DateTime).Value = ScanningTime; 

      SqlDataAdapter adapter = new SqlDataAdapter(command); 


      adapter.Fill(queryResult); 


      MyConn.Close(); 

      } 
     } 

Когда я нажимаю кнопка для сохранения изменений я получаю ошибку:

An unhandled exception of type 'System.Data.SqlTypes.SqlTypeException' occurred in System.Data.dll 

Additional information: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. 

EDIT:

Оглядываясь назад на мой SSMS, содержимое таблицы посещаемости изменилось после попытки обновления таблицы. Первоначальная запись была заменена записью, которая была добавлена ​​вручную (несмотря на ошибку).

посещаемость таблицы после выполнения запроса UPDATE:

TagID  SessionID  ScanningTime 
    int  nvarchar   datetime 
    --------------------------------------- 
    5453453  Test1 2013-08-16 14:20:00.000 
+0

Вы уверены, что это ваш код? В запросе отсутствует предложение where, поэтому он обновляет все записи в вашей таблице, запрос представляет собой запрос UPDATE, поэтому он не возвращает ничего, кроме количества затронутых строк. Наконец, заливка внутри цикла не имеет смысла – Steve

+0

Я не знаю, где в мире вы, а просто здравомыслящий, убедитесь, что ваши культуры верны. В Великобритании мы получаем это много, когда пытаемся вставить день в колонку месяца в американской культуре! – Liath

+0

вам нужно проверить, что такое 'DataType' в поле« ScanningTime ». ваша проблема кажется очевидной проблемой «Format DateTime». также я бы изменил параметр «Parameters.Add» на «Parameters.AddWithValue», чтобы сервер определил DataType. – MethodMan

ответ

0

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

Попробуйте преобразовать свой DateTime как это, когда вы добавляете его к параметрам:

ScanningTime.ToString("yyyy-MM-dd HH:mm:ss"); 

Позвольте мне знать, если это помогает.

+0

Я пробовал, но не успел – jaspernorth

0

Попробуйте формат даты-времени, как универсальный буквальным в SQL, то есть YYYYMMDD hh:mm:ss[.mmm], так как этот формат является культура независимой

Или, вы можете попробовать даже это:

string myDatetime = ScanningTime .ToString("yyyy-MM-ddTHH:mm:ss.fff"); 

И UPDATE заявление передать новую переменную myDateTime,.

Одна вещь, которую вы должны проверить в первую очередь, является ли это может быть NULL ScanningTime, потому что, DateTime поле в таблице SQL ожидать некоторого значения, и для типа данных даты и времени, минимальное значение 1/1/1753 12:00:00 и максимальное значение 12/31/9999 11:59:59.

+0

Я пробовал, но та же ошибка возникает string format = "YYYYMMDD hh: mm: ss [.mmm]"; ScanningTime.ToString (формат); – jaspernorth

+0

Можете ли вы отлаживать код в точке, где вы присваиваете значение инструкции UPDATE, чтобы увидеть, в каком формате datetime отправляется SQL? – veljasije

+0

Проверьте. System.DateTime – jaspernorth

Смежные вопросы