|
Программирование >> Программирование с использованием ajax
большая часть работы), с последующим сохранением этого изменения обратно в базу данных. 1. Создать новый объект DataRow. 2. Заполнить его некоторыми данными. 8. Добавить его в коллекцию Rows объекта DataSet. 4. Сохранить изменения в базе данных вызовом метода Update () адаптера данных. Схема выглядит вполне разумно. В следующем практическом занятии вы увидите, как именно это делается. Практическое занятие Добавление строк Выполните следующие шаги для создания примера AddingData в Visual С# 2008. 1. Создайте новое консольное приложение по имени AddingData в каталоге С:\BegVCSharp\Chapter28. 2. Начните с добавления директив using для классов ADO.NET, которые будут использованы: #region Using Directives using System; using System.Data; Использовать пространство имен ADO.NET using Sys tem. Data. SqlClient; Использовать пространство имен поставщика данных SQL Server using System.Collections.Generic; using System.Text; #endregion 3. Добавьте следующий код к методу Main (): static void Main(string [ ] args) { Указать специфичную для SQL Server строку соединения SqlConnection thisConnection = new SqlConnection ( @ Data Source=.\SQLEXPRESS; + (a AttachDbFilename=C:\SQL Server 2000 Sample Databases\NORTHWND.MDF; + (a Integrated Security=True;Connect Timeout=30;User Instance=true ); Создать объект DataAdapter для обновления и прочих операций SqlDataAdapter thisAdapter = new SqlDataAdapter( SELECT CustomerlD, CompanyName FROM Customers , thisConnection); Создать объект CommandBuilder для построения команд SQL SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter); Создать DataSet для хранения таблиц данных, строк и столбцов DataSet thisDataSet = new DataSet (); Заполнить DataSet, используя запрос, определенный ранее для DataAdapter thisAdapter.Fill(thisDataSet, Customers ); Console.WriteLine( количество строк до изменения: {0} , thisDataSet.Tables[ Customers ].Rows.Count); DataRow thisRow = thisDataSet.Tables[ Customers ].NewRow(); thisRow[ CustomerlD ] = ZACZI ; thisRow[ CompanyName ] = Zachary Zithers Ltd. ; thisDataSet.Tables[ Customers ].Rows.Add(thisRow); Console.WriteLine( количество строк после изменения: {0} , thisDataSet.Tables[ Customers ].Rows.Count); Вызвать команду Update для фиксации изменений в таблице thisAdapter.Update(thisDataSet, Customers ); thisConnection.Close(); Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine(); 4. При выполнении этот пример выдаст следующее: количество строк до изменения: 91 количество строк после изменения: 92 Программа завершена, нажмите Enter для продолжения: Описание полученных результатов Интересующие нас строки находятся между вызовами методов thisAdapter. Fill () и thisAdapter.Update(). Сначала, чтобы увидеть картину до изменений, вы вводите в программу новое свойство коллекции Rows - Count. Оно дает количество строк в таблице: Console.WriteLine( количество строк до изменения: {0} , thisDataSet.Tables[ Customers ].Rows.Count); Затем создается новый объект строки, используя метод NewRow () объекта DataSet: DataRow thisRow = thisDataSet.Tables[ Customers ].NewRow(); Обратите внимание, что это создает новый объект строки, использующий те же столбцы, что и в таблице Customers, но не добавляет их в DataSet; потребуется добавить некоторые значения столбцов, прежде чем это может быть сделано: thisRow[ CustomerlD ] = ZACZI ; thisRow[ CompanyName ] = Zachary Zithers Ltd. ; После этого вы можете в действительности добавить строку, используя метод Add () коллекции Rows: thisDataSet.Tables[ Customers ].Rows.Add(thisRow); Если вы снова проверите значение свойства Count после вызова Add (), то увидите, что оно увеличилось на единицу: Console.WriteLine( количество строк после изменения: {0} , thisDataSet.Tables[ Customers ].Rows.Count); Вывод показывает 92 строки - на одну больше, чем перед проведением изменения. Как и в предыдущем примере, необходим вызов Update () для того, чтобы действительно добавить строку в базу данных на диске: thisAdapter.Update (thisDataSet, Customers ); Напомним, что DataSet представляет собой находящуюся в памяти автономную копию данных; к базе данных на диске подключен объект DataAdapter. Поэтому должен быть вызван метод Update (), который синхронизирует данные в памяти из DataSet с данными в базе на диске. Заполнены только столбцы Customer ID и Company Name, поскольку это все, что использовалось в программе. Остальные столбцы остаются пустыми (на самом деле они содержат значение NULL в терминах SQL). Вы можете предположить, что заполнение, скажем. Contact Name - это просто вопрос добавления следующей строки кода: thisRow[ ContactName ] = Zylla Zithers ; Однако это не единственный шаг, который вы должны выполнить. Напомним, что когда выполняется исходный запрос, строится DataSet, состоящий только из двух столбцов - CustomerlD и CompanyName: SqlDataAdapter thisAdapter = new SqlDataAdapter( SELECT CustomerlD, CompanyName FROM Customers , thisConnection); Ссылка на ContactName вызовет ошибку, поскольку в построенном DataSet нет такого столбца. Вы могли бы поправить это, добавив столбец ContactName в исходный запрос SQL: SqlDataAdapter thisAdapter = new SqlDataAdapter( SELECT CustomerlD, ContactName, CompanyName FROM Customers , thisConnection); Альтернативно можно было бы выбрать все столбцы из Customers, используя следующую команду: SqlDataAdapter thisAdapter = new SqlDataAdapter( SELECT * FROM Customers , thisConnection); Здесь звездочка (*) в команде SQL SELECT является сокращением для всех столбцов таблицы; с этим изменением вы сможете добавить значения любых столбцов таблицы в базу данных. Однако получение всех столбцов при работе только с двумя или тремя неэффективно, и обычно вы должны его избегать. Поиск строк Если вы попытаетесь запустить предшествующий пример еще раз, то увидите сообщение, подобное показанному на рис. 28.4. Vtolation of PRIMARY К£У coTStraW .Customers, Cannot Insert (ЩсЛь \my in ob)ect dbo Customert Tht statement has Ьмп terrranated. Trouble hootinqtlp<: Gfl< Qcnef 9 h9p fo- trV5 e>(;eption, j Search for more Help Onfcne... Acltoni: V- Detal Copy exceptKsn detal to the dcboard Puc. 28.4. Сообщени£ 0 napyvienuuуникальности первичного ключа Это говорит о том, что вызов Add () завершился неудачей, поскольку предпринята попытка добавить дублированный первичный ключ. Определение таблицы Customers требует, чтобы поле CustomerlD содержало уникальные значения, что необходимо, когда столбец служит первичным ключом. Значение ZACZI уже присутствовало в базе, когда вы попытались запустить код второй раз, потому что было помещено в таблицу при первом его запуске. Давайте изменим логику примера таким образом, чтобы он сначала искал строку, прежде чем пытаться ее добавить. Коллекция Rows типа DataTable представляет метод по имени Find (), который очень удобен для этой цели. В следующем практическом занятии вы перепишете логику, окружающую добавление строки, с использованием Fill О вместо подсчета строк.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |