Вызов хранимой процедуры с объектом sqlcommand


У меня есть следующий код в составе команда sqlcommand, который вызывает хранимую процедуру:

Dim groupObj

If groupId = 0 Then
    groupObj = DBNull.Value
Else
    groupObj = groupId
End If

Dim siteObj

If siteId = 0 Then
    siteObj = DBNull.Value
Else
    siteObj = siteId
End If

sqlCommand.Parameters.Add(New SqlClient.SqlParameter("GroupID", SqlDbType.Decimal)).Value = groupObj
sqlCommand.Parameters.Add(New SqlClient.SqlParameter("SiteID", SqlDbType.Decimal)).Value = siteObj

Я в основном хочу проверить состояние и (если правда) отправить значение dbnull вместо этого. Однако этот код выглядит ужасно - как емко Это?



1729
2
задан 9 ноября 2011 в 03:11 Источник Поделиться
Комментарии
3 ответа

Можно использовать тернарный оператор, если():

sqlCommand.Parameters.Add(New SqlClient.SqlParameter("GroupID", SqlDbType.Decimal)).Value = If(groupID = 0, DBNull.Value, groupID)
sqlCommand.Parameters.Add(New SqlClient.SqlParameter("SiteID", SqlDbType.Decimal)).Value = If(siteId = 0, DBNull.Value, siteId)

Помните, что это может вызвать ошибку компилятора, если у вас есть строгий параметр включен. Следующий вариант строгой совместимы...

sqlCommand.Parameters.Add(New SqlClient.SqlParameter("GroupID", SqlDbType.Decimal)).Value = If(groupID = 0, DBNull.Value, CObj(groupID))
sqlCommand.Parameters.Add(New SqlClient.SqlParameter("SiteID", SqlDbType.Decimal)).Value = If(siteId = 0, DBNull.Value, CObj(groupID))

Если тернарный оператор был добавлен в .Net 3.5 С Visual Основные 2008. Если вы используете более ранние версии, вам потребуется использовать функцию IIF. Синтаксис почти такой же, просто заменить, если с ииф

sqlCommand.Parameters.Add(New SqlClient.SqlParameter("GroupID", SqlDbType.Decimal)).Value = IIF(groupID = 0, DBNull.Value, groupID)
sqlCommand.Parameters.Add(New SqlClient.SqlParameter("SiteID", SqlDbType.Decimal)).Value = IIF(siteId = 0, DBNull.Value, siteId)

3
ответ дан 9 ноября 2011 в 07:11 Источник Поделиться

Вы можете определить метод расширения такой (я не глаг программист, поэтому прошу прощения за синтаксические ошибки):

<Extension()> 
Public Sub OrDBNull(ByVal val As Decimal)
If val = 0
return DBNull.Value
End If

return val ;
End Sub

Так что ваши параметры команды станут:

sqlCommand.Parameters.Add(New SqlParameter("GroupID", SqlDbType.Decimal)).Value = groupObj.OrDBBull()
sqlCommand.Parameters.Add(New SqlParameter("SiteID", SqlDbType.Decimal)).Value = siteObj.OrDBNull()

1
ответ дан 9 ноября 2011 в 04:11 Источник Поделиться

Вы должны написать метод расширения для класса sqlcommand

<Extension()>
Public Sub AddParamWhereZeroIsNull(command As SqlCommand, name As String, value As Decimal?)
command.Parameters.Add(New SqlParameter(name, SqlDbType.Decimal) With {.Value = If(value.GetValueOrDefault() = 0, DbNull.Value, value)})
End Sub

0
ответ дан 29 марта 2012 в 12:03 Источник Поделиться