SQL Server -> Преобразование .Net int

#c# #.net #sql-server #sql-server-2005 #.net-3.5

#c# #.net #sql-сервер #sql-server-2005 #.net-3.5

Вопрос:

У меня была строка кода в приложении WinForms (целевая платформа x86) Я сделал, который содержал это…

 if (dtMax.Rows[0][0] != System.DBNull.Value) 
      iPrevMax = (Int64)(dtMax.Rows[0][0]);
  

Я знаю, что dtMax.Rows[0][0] будет MAX столбцом в заданной таблице в SQL Server. Тип данных столбца равен INT .

Теперь — эта строка кода в какой-то момент вызвала исключение. Я не знаю, что было исключением, поскольку я был в отпуске, и никто не обратил внимания!! Сердитое лицо.

Однако строка была изменена на….

 if (dtMax.Rows[0][0] != System.DBNull.Value) 
      iPrevMax = Convert.ToInt64(dtMax.Rows[0][0]);
  

… И теперь это работает.

Я понимаю несколько вещей…

  • .Net-эквивалент SQLServer INT Int32 — so действительно должен был быть распакован для этого.

  • Convert как правило, будет «безопаснее», чем распаковка

Но я не понимаю, почему эта строка кода должна работать изначально, а затем в какой-то момент не может быть распакована?Каковы могут быть возможные причины — несмотря на досадное незнание фактического исключения…

Комментарии:

1. Как создается база данных, то есть, есть ли у вас инструмент, который создает все таблицы, скрипт, или вы поручаете кому-то это сделать, то есть, может ли быть разница в определении таблицы между тестированием и производством?

2. И насколько вы уверены, что эта строка кода действительно когда-либо выполнялась до ее сбоя?

3. И я подвергаю сомнению ваш вывод «и теперь это работает». Если вы не можете воспроизвести ошибку, вы не можете с уверенностью сказать, что она работает. Например, что, если в dtMax таблице не было строк, поэтому проблема никогда не заключалась в том, что вы пытались распаковать / привести неправильный тип, просто в то время не было данных? Если он «работал» до того, как вы его изменили, и он «работает» после этого, как вы можете сказать, что то, что вы сделали, действительно помогло?

4. Таблица была создана вручную с помощью скрипта CREATE TABLE очень просто. На самом деле код, выполненный на моем компьютере (который является Win7), и сбой на компьютере пользователя — хотя, я думаю, он сработал один раз. Если в dtMax таблице не было строк, то выполняемый мной запрос все равно возвращал бы строку, dtMax.Rows[0][0] равную SQL NULL , которая обрабатывалась бы обеими версиями кода.

5. Компьютер пользователя — XP. Как вы думаете, это могло бы это объяснить?