#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]
равную SQLNULL
, которая обрабатывалась бы обеими версиями кода.5. Компьютер пользователя — XP. Как вы думаете, это могло бы это объяснить?