DataReader в блоке try, приводящий к потенциальной ошибке нулевой ссылки - PullRequest
2 голосов
/ 30 сентября 2008

Вероятно, есть простое исправление для этого, но у меня в настоящее время есть код, подобный

dim dr as dbDataReader

try
      dr = connection.getDataReader(sql_str)
Catch ex as sqlClientException
     log.error(ex)
finally 

  if not IsNothing(dr) then
    dr.close
  end if
end try

Однако Visual Studio все еще предупреждает меня, что

if not IsNothing(dr) then
        dr.close
      end if

Может вызвать исключение NullReferenceException. Каков наилучший способ смягчить это? Я не могу переместить объявление в блок try.

Ответы [ 4 ]

9 голосов
/ 30 сентября 2008

Явно инициализируйте объявление dr в Nothing следующим образом:

Dim dr As DbDataReader = Nothing

И предупреждение исчезнет.

4 голосов
/ 30 сентября 2008

Если GetDataReader выбрасывает, dr не будет назначено и все еще будет иметь свое начальное значение. VB.NET инициализирует ссылки на Nothing, но компилятор не позволит вам полагаться на это.

При использовании .NET 2.0 я бы порекомендовал оператор Using:

Using dr As DbDataReader = connection.GetDataReader(sql_str)
    Try
        ' Do something with dr '
    Catch ex As SqlClientException
        log.error(ex)
    End Try
End Using
0 голосов
/ 30 сентября 2008

Я не помню точно, как VB.NET инициализирует переменную, но в C # вы должны установить "dr" некоторое значение / ссылку, прежде чем использовать их где-то.

Я думаю, что это должно работать:

dim dr as dbDataReader

try
      dr = connection.getDataReader(sql_str)
Catch ex as sqlClientException
     log.error(ex)
     dr = Nothing ' there is the change '
' finaly block is not necesary '
end try

if not IsNothing(dr) then
  dr.close
end if
0 голосов
/ 30 сентября 2008

Ваш код правильный. В операторе finally, пока вы проверяете, чтобы убедиться, что ваши объекты не равны NULL, он не сгенерирует исключение нулевой ссылки на основе того, что происходит в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...