Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Метод Load

Метод Loadиспользуется для загрузки в таблицуDataTableстрок из источника данных. Это перегруженный метод, который в своей простейшей форме имеет единственный параметр,DataReader. В этой форме он просто загружает строки в таблицуDataTable. Дополнительно можно задать параметрLoadOption, который управляет добавлением данных в таблицуDataTable.

Параметр LoadOptionособенно удобен в тех случаях, когда объектDataTableуже содержит строки данных, поскольку позволяет описать, как входящие данные из источника данных должны быть объединены с данными, уже находящимися в таблице. Например, значениеPreserveCurrentValuesэтого параметра (используемое по умолчанию) указывает, что в случаях, если в объектеDataTableкакая-то строка отмечена какAdded, значениюOriginalкаждого столбца присваивается содержимое соответствующей строки из источника данных. Использование значенияCurrentприводит к сохранению значений, присвоенных при добавлении строки, а параметру строкиRowStateприсваивается значениеChanged.

В следующей таблице приведено краткое описание значений перечисления LoadOption.

Значение LoadOption

Описание

OverwriteRow

Если входящие строки имеют такое же значение PrimaryKey, что и одна из строк, уже находящихся в объектеDataTable, то значенияOriginalиCurrentкаждого столбца заменяются значениями из входящей строки, а свойствуRowStateприсваивается значениеUnchanged.

Строки из источника данных, которые еще не существуют в объекте DataTable, добавляются со свойствомRowState, равнымUnchanged.

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

PreserveCurrentValues (значение по умолчанию)

Если входящие строки имеют такое же значение PrimaryKey, что и одна из строк, уже находящихся в объектеDataTable, то значениеOriginalустанавливается равным содержимому входящей строки, а значениеCurrentне изменяется.

Если свойство RowStateимеет значениеAddedилиModified, то ему присваивается значениеModified.

Если свойство RowStateимело значениеDeleted, то оно остается равнымDeleted.

Строки из источника данных, которые пока еще отсутствуют в объекте DataTable, добавляются, а свойствуRowStateприсваивается значениеUnchanged.

UpdateCurrentValues

Если входящие строки имеют такое же значение PrimaryKey, что и одна из строк, уже находящихся в объектеDataTable, то значениеCurrentкопируется в значениеOriginal, после чего значениюCurrentприсваивается содержимое входящей строки.

Если свойство RowStateв объектеDataTableимело значениеAdded, то это свойствоRowStateостается равнымAdded. Для строк, отмеченных какModifiedилиDeleted, свойствуRowStateприсваивается значениеModified.

Строки из источника данных, которые пока еще отсутствуют в объекте DataTable, добавляются, а свойствуRowStateприсваивается значениеAdded.

В следующем образце метод Loadиспользуется для отображения списка дней рождения сотрудников, представленных в базе данныхNorthwind.

[Visual Basic]

Private Sub LoadBirthdays(ByVal connectionString As String)

' Assumes that connectionString is a valid connection string

' to the Northwind database on SQL Server.

Dim queryString As String = _

"SELECT LastName, FirstName, BirthDate " & _

" FROM dbo.Employees " & _

"ORDER BY BirthDate, LastName, FirstName"

' Open and fill a DataSet.

Dim adapter As SqlDataAdapter = New SqlDataAdapter( _

queryString, connectionString)

Dim employees As New DataSet

adapter.Fill(employees, "Employees")

' Create a SqlDataReader for use with the Load Method.

Dim reader As DataTableReader = employees.GetDataReader()

' Create an instance of DataTable and assign the first

' DataTable in the DataSet.Tables collection to it.

Dim dataTableEmp As DataTable = employees.Tables(0)

' Fill the DataTable with data by calling Load and

' passing the SqlDataReader.

dataTableEmp.Load(reader, LoadOption.OverwriteRow)

' Loop through the rows collection and display the values

' in the console window.

Dim employeeRow As DataRow

For Each employeeRow In dataTableEmp.Rows

Console.WriteLine("{0:MM\\dd\\yyyy}" & ControlChars.Tab & _

"{1}, {2}", _

employeeRow("BirthDate"), _

employeeRow("LastName"), _

employeeRow("FirstName"))

Next employeeRow

' Keep the window opened to view the contents.

Console.ReadLine()

End Sub

Изменения объекта DataTable

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

Изменения объекта DataTable

Обновлен: November 2007

При выполнении изменений значений столбцов в DataRow, изменения немедленно помещаются в текущее состояние строки. Затем дляDataRowStateустанавливается значениеИзменено, и изменения принимаются или отвергаются с использованием методовAcceptChangesилиRejectChangesобъектаDataRow. ОбъектDataRowпредоставляет также три метода, которые можно использовать для приостановки состояния строки, пока пользователь выполняет ее изменение. Такими методами являются:BeginEdit,EndEditиCancelEdit.

При изменении значений столбцов непосредственно в DataRowобъектDataRowуправляет значениями столбцов с использованием версий строкиCurrent,DefaultиOriginal. В дополнение к этим версиям строки, методыBeginEdit,EndEditиCancelEditиспользуют четвертую версию строки:Proposed. Дополнительные сведения о версиях строк см. в разделеСостояния и версии строк.

Версия Proposedстроки существует во время операции изменения, которая начинается вызовомBeginEdit, а заканчивается использованием методовEndEditилиCancelEdit, либо вызовом методовAcceptChangesилиRejectChanges.

Во время операции изменения к отдельным столбцам можно применить логику проверки, оценив ProposedValueв событииColumnChangedтаблицыDataTable. СобытиеColumnChangedсодержитDataColumnChangeEventArgs, где хранится ссылка на изменяемый столбец и наProposedValue. После оценки предложенного значения можно изменить его или отменить изменение. Когда изменение заканчивается, строка выводится из состоянияProposed.

Изменения можно подтвердить, вызвав метод EndEdit, либо можно их отменить, вызвав методCancelEdit. Следует отметить, что в то время как методEndEditподтверждает изменения, методDataSetфактически не принимает изменения до тех пор, пока не будет вызван методAcceptChanges. Отметим также, что если методAcceptChangesвызывается до окончания изменений при помощиEndEditилиCancelEdit, то изменение заканчивается и значения строкProposedпринимаются и для версииCurrent, и для версииOriginalстроки. Таким же образом вызов методаRejectChangesзаканчивает изменения и отменяет версииCurrentиProposedстрок. Вызов методаEndEditилиCancelEditпосле вызоваAcceptChangesилиRejectChangesне оказывает никакого влияния, т. к. изменение уже закончено.

Следующий пример демонстрирует, как использовать метод BeginEditс методамиEndEditиCancelEdit. В примере также проверяетсяProposedValueв событииColumnChanged, выполняется решение, отменить ли изменение.

Язык Visual Basic

Dim workTable As DataTable = New DataTable

workTable.Columns.Add("LastName", Type.GetType("System.String"))

AddHandler workTable.ColumnChanged, _

New DataColumnChangeEventHandler(AddressOf OnColumnChanged)

Dim workRow As DataRow = workTable.NewRow()

workRow(0) = "Smith"

workTable.Rows.Add(workRow)

workRow.BeginEdit()

' Causes the ColumnChanged event to write a message and cancel the edit.

workRow(0) = ""

workRow.EndEdit()

' Displays "Smith, New".

Console.WriteLine("{0}, {1}", workRow(0), workRow.RowState)

Private Shared Sub OnColumnChanged( _

sender As Object, args As DataColumnChangeEventArgs)

If args.Column.ColumnName = "LastName" Then

If args.ProposedValue.ToString() = "" Then

Console.WriteLine("Last Name cannot be blank. Edit canceled.")

args.Row.CancelEdit()

End If

End If

End Sub

Язык C#

DataTable workTable = new DataTable();

workTable.Columns.Add("LastName", typeof(String));

workTable.ColumnChanged +=

new DataColumnChangeEventHandler(OnColumnChanged);

DataRow workRow = workTable.NewRow();

workRow[0] = "Smith";

workTable.Rows.Add(workRow);

workRow.BeginEdit();

// Causes the ColumnChanged event to write a message and cancel the edit.

workRow[0] = "";

workRow.EndEdit();

// Displays "Smith, New".

Console.WriteLine("{0}, {1}", workRow[0], workRow.RowState);

protected static void OnColumnChanged(

Object sender, DataColumnChangeEventArgs args)

{

if (args.Column.ColumnName == "LastName")

if (args.ProposedValue.ToString() == "")

{

Console.WriteLine("Last Name cannot be blank. Edit canceled.");

args.Row.CancelEdit();

}

}