ADO.NET: DataSet или DataTable и как получить данные - PullRequest
2 голосов
/ 18 мая 2009

ТАК сообщество

Я начинаю работать с ADO.NET и довольно плохо знаком с программированием. У меня уже была некоторая поддержка от этого сообщества, которая была очень полезна и у меня был другой вопрос.

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

В моем проекте у меня есть база данных, и при загрузке формы я подключаюсь к своей базе данных и создаю таблицу данных, как показано ниже:

Public Class GetEmployeeDataset

Private tbl As New DataTable

Public Sub New()
    Dim strConn, strSQL As String
    strConn = "Data Source=.\SQLExpress;Initial Catalog=MyDatabase;Integrated Security=True;"
    strSQL = "SELECT * FROM EmployeeTable"

    Dim da As New SqlDataAdapter(strSQL, strConn)
    da.Fill(tbl)
End Sub

End Class

На данный момент у меня есть два вопроса:

  1. Я использую DataTable, а не DataSet, потому что, насколько я понимаю, DataSet - это набор DataTables, и у меня здесь только один простой DataTable (5 столбцов, 100 строк), поэтому проще использовать DataTable , Что-то не так с этим?
  2. Теперь, когда у меня есть DataTable (в моем примере - «tbl»), как я могу запросить этот DataTable для получения правильных данных, т. Е. EmailAddress, основываясь на имени сотрудника? В SQL это будет "SELECT EmailAddress WHERE EmployeeName = SelectedItem". Я рассмотрел использование метода Select в DataTable, но безрезультатно, а затем перешел к методу RowFilter в DataView, но безуспешно.

Кто-нибудь может указать мне правильное направление, пожалуйста?

Alex

Ответы [ 5 ]

1 голос
/ 19 мая 2009

Оставаясь с объектами ADO, вы можете использовать DataView ...

  Dim dv As DataView
  Dim strFilter As String
  Dim strEmail As String = ""  

  strFilter = "EmployeeName = '" & cbo.Text & "'"  

  dv = tbl.DefaultView
  dv.RowFilter = strFilter  

  If dv.Count > 0 Then
     strEmail = dv(0).Item("EmailAddress").ToString
  End If
1 голос
/ 18 мая 2009

Я вообще не использую DataSets или DataTables. Единственная причина, по которой я нашел их использование, заключается в том, что вы хотите держать все данные в автономном режиме, вносить изменения в данные, а затем фиксировать эти изменения обратно в базу данных по мере необходимости.

Если все, что вы делаете, это получение данных с сервера на основе взаимодействия с пользователем, то может быть излишним использовать DataTable.

Редактировать: Да, и ответить на ваши актуальные вопросы:

  1. Звучит хорошо, так как вам нужен только один стол.
  2. Используйте метод Select в DataTable (который будет возвращать массив DataRows, которые удовлетворяют условию where)
0 голосов
/ 19 мая 2009

При наличии 100 записей (или 1 000 000, если они проиндексированы по имени сотрудника) лучшим вариантом для этого конкретного случая является получение нужного адреса электронной почты с использованием метода ExecuteScalar объекта SqlCommand. Вытягивать всю таблицу через провод, чтобы получить только одно поле, почти всегда плохая идея. Выбрать * даже с предложением where, как правило, тоже плохая идея, как по производительности, так и по причинам обслуживания.

Следующий код даст вам электронный адрес для имени сотрудника.

Using cn as new SqlConnection("Data Source=.\SQLExpress;Initial Catalog=MyDatabase;Integrated Security=True;")
    Using cmd as new SqlCommand("SELECT EmailAddress From Employees WHERE EmployeeName = '" & employeeName & "'", cn)
        Return TryCast(cmd.ExecuteScalar(), String)
    End Using
End Using

Как уже говорили другие, DataTables предназначены для автономного хранения в тех относительно редких случаях, когда это необходимо. И вы правы, нет никаких причин использовать DataSet, если вам не нужно автономно кэшировать всю базу данных (или подмножество базы данных).

0 голосов
/ 19 мая 2009
  1. Поскольку DataSet просто хранит несколько DataTables и управляет отношениями и представлениями между ними, вы можете использовать здесь :: shudder :: DataTable.

  2. Вы должны рассмотреть, что именно здесь происходит. Когда вы говорите «SELECT * FROM EmployeeTable», вы будете делать именно это - получать все эти данные из базы данных, а затем пытаться отфильтровать их вне базы данных в коде приложения. Это не очень хорошая идея по ряду причин, но сейчас давайте просто скажем, что мы должны позволить базам данных выполнять работу, в которой они действительно хороши, а именно фильтрацию и сортировку данных.

Скорее всего, вы найдете Linq to SQL гораздо более простой в реализации технологией, чем страдаете от ADO.NET. Существует множество учебных материалов по этой теме, поэтому вот один из них, с которого можно начать (хотя он и старше). Linq to SQL, по сути, позволит вам перенести свои знания SQL на основе множеств в область приложения и обеспечить хорошую производительность при загрузке (т. Е. Вы можете начать с «SELECT * FROM Employees» и последовательно добавлять к нему фильтры, например «WHERE Name». = "Смит" ", который в конечном итоге выполняется в базе данных).

Если вы абсолютно, безусловно, должны использовать ADO.NET и использовать этот подход, вы можете сделать:

yourDataTable.Select("EmployeeName='" + yourSelectedValue + "'")
0 голосов
/ 18 мая 2009

Простое перечисление сработает:

string email = string.Empty;
foreach (Row row in tbl.Rows)
{
    string employeeName = (string)row["EmployeeName"];
    if (employeeName == "John")
    {
        email = (string)row["Email"];
        break;
    }
}

или вы можете попробовать LINQ:

var email = (from row in tbl.Rows
            where (string)row["EmployeeName"] == "John"
            select (string)row["Email"]).First ();

Я не проверяю код в VS, поэтому "опечатки зарезервированы". Извините за версию C #, но я не знаю VB.

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