Проверка наборы данных для таблиц и строк


Есть более точный способ проверки набора данных для таблиц/строк, прежде чем пытаться их читать?

If ds.Tables.Count > 0 Then
    If ds.Tables(0).Rows.Count > 0 Then

        'do something with the the rows at this point

    End If
End If

Редактировать для уточнения - я говорю конкретно про два типа bool проверяет, чтобы увидеть, если набор данных содержит вообще каких-либо данных в таблице(0).



19095
3
задан 14 декабря 2011 в 03:12 Источник Поделиться
Комментарии
4 ответа

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

VB.NET

Public NotInheritable Class DataSetExtensions
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Shared Function IsTableDataPopulated(dataSet As DataSet) As Boolean
Return dataSet IsNot Nothing AndAlso dataSet.Tables.Count > 0 AndAlso dataSet.Tables(0).Rows.Count > 0
End Function
End Class

в C#

public static class DataSetExtensions
{
public static bool IsTableDataPopulated(this DataSet dataSet)
{
return dataSet != null && dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0;
}
}

Использование

if (ds.IsTableDataPopulated()) 
{
// do stuff
}

Примечание: Я не уверен на 100%, если VB кода работает, как я использовал переводчик для перевода C# для VB.NET назвать меня ленивой :)

5
ответ дан 1 января 2012 в 02:01 Источник Поделиться

Я делаю пару предположений, но я надеюсь, что я в цель.

Если вы просто хотите, чтобы первый столбец первой строки, вы должны использовать команду sqlcommand.Executescalar так вместо того, чтобы читать его в набор данных.

Например:

using (var cn = new SqlConnection("..."))
{
using (var cmd = new SqlCommand("SELECT statusCode FROM table WHERE whatever", cn)
{
cn.Open();
return (string)cmd.ExecuteScalar();
}
}

(Обратите внимание на использование инструкции, если вы не знаете его. Он автоматически удаляет и команды подключения)

Вы также можете посмотреть в с помощью sqlcommand.Метода executereader, который возвращает объект sqldatareader. Последняя становится чище и имеет более высокую производительность, чем тоже способ набора.

using (var reader = cmd.ExecuteReader())
{
while(reader.Read())
{
var value = reader.GetString(0);
}
}

5
ответ дан 15 декабря 2011 в 09:12 Источник Поделиться

Это выглядит как хорошая возможность использовать атакже.

Из документации MSDN (http://msdn.microsoft.com/en-us/library/cb8x3kfz(в=против 80).аспн):


Одно использование оператор andalso для проверки на существование
экземпляр объекта, прежде чем пытаться получить доступ к одному из ее членов.

В вашем случае:

Если ДС.Таблицы.Количество > 0 атакже ДС.Столы(0).Строк.Количество > 0 Тогда

(Который является в основном то, что сказал Кейн, без фанки methoding расширение - теперь, когда я перечитала свой ответ)

5
ответ дан 10 сентября 2012 в 01:09 Источник Поделиться

    Dim ds As New DataSet
Dim bExists As Boolean
Try
bExists = ds.Tables(0).Rows.Count > 0
Catch
'There is no rows or either the Dataset or DataTable are nothing/null
End Try

If bExists Then
'... Do your task
End If

bExists будет справедливо , если dataset и DataTable не ничего и объект DataTable со строками. Если один из них не является ссылка на объект исключения , будут иметь место и bExists остается ложным, даже если они не ничего, но в таблице нет строк, то bExists будет ложным.

0
ответ дан 12 апреля 2014 в 02:04 Источник Поделиться