не проверять DataRow.IsDBNull в каждом столбце?

Мой код в 2 раза длиннее, чем если бы я мог автоматически установить IsDBNull в "" или просто перевернуть его без ошибки.

Это мой код:

Dim conn As New SqlConnection
conn.ConnectionString = Module1.DBConn2
Dim sqlCommand = New SqlCommand("SELECT * FROM table", conn)
conn.Open()
Dim sqlDataset As DataSet = New DataSet()
Dim sqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(sqlCommand)
sqlDataAdapter.Fill(sqlDataset)
conn.Close()

For Each rs As DataRow In sqlDataset.Tables(0).Rows
    If Not IsDBNull(rs("column")) Then
        Response.Write(rs("column"))
    Else
        Response.Write("")
    End If

    Response.Write("some stuff to write")

    If Not IsDBNull(rs("column2")) Then
        Response.Write(rs("column2"))
    Else
        Response.Write("")
    End If
Next

В этом случае я просто хотел бы ввести Response.Write(rs("column")) вместо оператора If, а если column IsDBNull, то вывести пустую строку.

Как я могу это сделать?

Спасибо заранее!


person Community    schedule 18.01.2013    source источник


Ответы (4)


Вы можете просто использовать String.Join и передать row.ItemArray:

For Each row As DataRow In sqlDataset.Tables(0).Rows
    Response.Write(String.Join("", row.ItemArray))
Next

Это работает, поскольку DBNull.ToString возвращает пустую строку.

Если вы хотите обратиться к каждому столбцу, вы можете использовать строго типизированный DataRowExtensions.Field метод, который поддерживает значения NULL и возвращает null/Nothing для строки. Затем вы можете использовать null-coalescing operator (?? в C#, If в VB).

Dim rowInfo = String.Format("{0}{1}{2}",
                            If(row.Field(Of String)("Column1"), ""),
                            If(row.Field(Of String)("Column2"), ""),
                            If(row.Field(Of String)("Column3"), ""))

Однако обратите внимание, что String.Format в любом случае неявно преобразует null/Nothing в "", поэтому If является избыточным и просто к сведению.

MSDN:

Если объект, указанный индексом, является пустой ссылкой (Ничего в Visual Basic), то элемент формата заменяется пустой строкой ("").

person Tim Schmelter    schedule 18.01.2013
comment
одним словом: неопытность - person ; 24.01.2014
comment
@gracchus: я удалил свой комментарий ;) - person Tim Schmelter; 24.01.2014

Вот однострочный:

Response.Write(rs.IsNull("column") ? "" : rs("column"));

или сделать его методом расширения:

public string GetValueOrBlankString(this DataRow rs, string column)
{
    return rs.IsNull(column) ? "" : rs(column).ToString();
}

затем назовите это как:

Response.Write(rs.GetValueOrBlankString("column"));
person D Stanley    schedule 18.01.2013
comment
Что ж, OP ищет vb.net, однако может сработать функция if() (но не iif, поскольку она вызовет исключение нулевой ссылки) - person yoel halb; 13.11.2013

Расширения набора данных дают вам чистый способ сделать это, а также строго типизированы. Однако тип должен соответствовать типу столбца в базе данных. Если столбец базы данных может быть пустым, используйте тип, допускающий значение null, как показано ниже. Нулевые значения становятся Nothing для возвращаемого типа, допускающего значение NULL.

For Each rs As DataRow In sqlDataset.Tables(0).Rows

    'If string, you can use this. Null becomes nothing for the string.
    Response.Write(rs.field(of String)("column"))

    'if it's another type
    Response.Write(rs.field(of Integer?)("column"))


Next
person Ceres    schedule 18.01.2013

Ответ Цереры, вероятно, лучший, учитывая, что он избегает любого вида нулевого тестирования, но стоит отметить, что функция «IIF» также сработает с ней довольно хорошо. Он по-прежнему будет выполнять тест на нулевое значение, но он намного компактнее, чем изначально делал Джо. Что-то вроде этого должно помочь:

For Each rs As DataRow In sqlDataset.Tables(0).Rows

    Response.Write( IIF( IsDBNull(rs("column")), "", rs("column") ) )

Next

Что хорошо в этом, так это то, что вы можете заменить «» на то, что хотите вывести, если значение на самом деле равно нулю (приятный небольшой дополнительный бонус.)

Вот некоторая информация о функции «IIF» для тех, кто не знает, что это такое:

http://msdn.microsoft.com/en-ca/library/27ydhh0d(v=vs.71).aspx

person gbinflames    schedule 04.03.2013
comment
Iif() является частью пространства имен Microsoft.VisualBasic и не является функцией .NET. If() следует использовать на месте и избегать полного вызова функции. - person James Hyde; 17.10.2016