Лекция ASP 7: ASP и база данных (2)
Автор:Eve Cole
Время обновления:2009-05-30 19:55:02
В предыдущей лекции мы узнали, как установить соединение с базой данных и получить данные из базы данных. Сегодняшний материал посвящен тому, как добавлять новые данные в базу данных, изменять и удалять данные в базе данных.
1. Способ 1 для добавления новых данных в базу данных: используйте инструкции SQL, например wuf50.asp.
Чтобы упростить будущие процедуры, часть подключения к базе данных Access помещается в файл. Этот файл не будет объясняться, когда он понадобится в будущем.
<% 'AdoAccess.asp
Опция явная
Ответ.Истекает = 0
'Часть 1: Установление соединения
Дим Cnn, StrCnn
Установить Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Поставщик = Microsoft.Jet.OLEDB.4.0; Источник данных = C:InetpubhomeaspNorthwind.mdb"
Cnn.Open StrCnn
%>
Программа wuf50.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<% 'wuf50.asp
'Часть 2. Добавление новых данных с помощью объекта «Выполнение соединения».
Дим StrSQL, rsTest
StrSQL = "ВСТАВИТЬ В грузоотправителя (название компании, номер телефона) ЗНАЧЕНИЯ('wu''feng','0571-7227298')"
Cnn.Execute StrSQL
%>
<HTML>
<ТЕЛО>
<% 'Часть 3: Отображение полученного набора записей в браузере
Set rsTest = Cnn.Execute("Выбрать * От оператора связи")
Делайте, пока не rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Петля
'Часть 4: Зачистка поля боя
Cnn.закрыть
Установить rsTest = Ничего: Установить Cnn = Ничего
%>
</ТЕЛО>
</HTML>
Обратите внимание на следующие моменты:
1. При использовании операторов SQL для добавления данных в базу данных Access необходимо использовать Insert Into. Чтобы добавить данные в базу данных SQL Server, просто используйте Insert.
2. Формат добавления данных с помощью операторов SQL такой же, как в приведенном выше примере. Обратите внимание, что в операторе необходимо добавить «wu''feng», поскольку операторы SQL используют ' в качестве разделителя строк.
3. Объединив этот пример с тем, что вы узнали ранее, вы можете добавлять данные из формы HTML.
4. Обратите внимание, что в этом примере есть поле с типом данных автоматической нумерации, например «Идентификатор грузоотправителя», поэтому вам не нужно думать, как писать код для получения возрастающего номера.
Способ 2. Используйте метод Addnew объекта Recordset, например wuf51.asp.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf51.asp
'Часть 2. Добавьте новые данные с помощью метода AddNew объекта Recordset.
Дим StrSQL, rsTest
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenKeySet 'adOpenDynamic
«Без следующего предложения базу данных нельзя будет обновить. Почему?
rsTest.LockType = adLockOptimistic
rsTest.Open «Отправитель», Cnn,,,adCmdTable
rsTest.AddNew
rsTest("Название компании") = "wu'feng"
rsTest("Телефон") = "0571-7227298"
rsTest.Update
%>
<HTML>
<ТЕЛО>
<% 'Часть 3: Отображение полученного набора записей в браузере
'Перемещаем указатель базы данных на первую запись таблицы
Если Не rsTest.EOF <> 0 Тогда
Response.Write "В таблице есть [" & rsTest.RecordCount & "] фрагменты данных" & "<Br><Br>"
rsTest.MoveFirst
Конец, если
Делайте, пока не rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Петля
'Часть 4: Зачистка поля боя
Cnn.закрыть
Установить rsTest = Ничего: Установить Cnn = Ничего
%>
</ТЕЛО>
</HTML>
анализировать:
1. Зачем устанавливать rsTest.LockType = adLockOptimistic
Свойство LockType объекта Recordset имеет четыре необязательных значения:
adLockReadOnly — значение по умолчанию, указывающее, что набор записей открыт в режиме только для чтения, поэтому данные не могут быть изменены. В этом случае при использовании метода AddNew возникнет ошибка.
adLockPessimistic — консервативная блокировка записей (поэлементно). Используйте метод немедленной блокировки записей источника данных при редактировании. В это время другие пользователи не могут получить доступ к данным.
adLockOptimistic – блокировка открытых записей (поэлементно). Записи блокируются только при вызове метода Update. Подумайте, похоже ли это свойство на свойства Lock и Unlock объекта Application, о котором мы говорили?
adLockBatchOptimistic — открывать пакетные обновления. Используется для пакетного обновления данных, что соответствует методу UpdateBatch.
Кстати, упомянем упомянутый в предыдущей лекции атрибут CursorType, который тоже имеет четыре значения:
adOpenForwardOnly — курсор только для перемотки вперед, значение по умолчанию, может прокручивать запись только вперед. Это экономит ресурсы и повышает производительность.
adOpenStatic — статический курсор. Статическая копия коллекции записей, которую можно использовать для поиска данных или создания отчетов. Кроме того, дополнения, изменения или удаления, сделанные другими пользователями, не видны. В ASP рекомендуется использовать только эти два курсора.
adOpenKeyset — курсор набора ключей. Курсоры набора ключей аналогичны динамическим курсорам, за исключением того, что им запрещен просмотр записей, добавленных другими пользователями, и запрещен доступ к записям, удаленным другими пользователями. Изменения данных, внесенные другими пользователями, по-прежнему будут видны.
adOpenDynamic — динамический курсор. Может видеть добавления, изменения и удаления, сделанные другими пользователями. Разрешены все типы перемещений внутри набора записей.
Несомненно то, что такое абстрактное описание несколько обманчиво, и я до сих пор его не совсем понимаю. Проще говоря,
(1) Если вы только извлекаете данные, просто используйте значение по умолчанию;
(2) Если вы используете метод Update для обновления части данных, используйте adLockOptimistic для атрибута LockType и используйте adLockBatchOptimistic, если вы используете метод UpdataBatch для пакетного обновления данных.
(3) Если есть действие записи в базу данных, обычно достаточно использовать adOpenKeyset для атрибута CursorType.
Как насчет этого? Даже если вы еще этого не понимаете, вы можете это использовать.
2. Если вы плохо разбираетесь в базах данных, часто бывает полезно использовать rsTest.MoveFirst для перемещения указателя на первую запись перед отображением вывода. Однако если в базе данных нет данных, метод MoveFirst использовать нельзя, поэтому перед использованием используйте атрибут rsTest.EOF, чтобы определить, есть ли данные в базе данных.
3. Свойство RecordCount (для получения количества записей в наборе записей) можно использовать только в том случае, если для типа курсора установлено значение adOpenKeyset или adOpenStatic.
2. Измените существующие данные в базе данных. Способ 1. Используйте операторы SQL. Например, wuf52.asp, программа по сути аналогична wuf50.asp, здесь перечислены только ключевые части.
'Часть 2. Измените данные с помощью метода Execute объекта Connection.
Дим StrSQL, rsTest
StrSQL = "ОБНОВИТЬ НАБОР оператора связи = '(503) 555-3188' ГДЕ телефон НРАВИТСЯ '%99%'"
Cnn.Execute StrSQL
Чтобы изменить данные, вам не нужно использовать INSERT INTO...VALUES, а использовать оператор UPDATE...SET. Предложение WHERE означает изменение номера телефона, содержащего строку «99» («LIKE» и «%»). " часто используются в нечетких запросах) на номер (503) 555-3188, если не заданы условия, то все номера телефонов в таблице будут изменены.
Способ 2. Используйте метод Update объекта Recordset. Программа wuf53.asp (аналогично программе wuf51.asp)
'Часть 2. Изменение данных с помощью метода Update объекта Recordset.
Дим StrSQL, rsTest
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "ВЫБЕРИТЕ фамилию, имя, дату рождения ОТ сотрудника ГДЕ дата рождения = #55-03-04#"
rsTest.Open StrSQL, Cnn,,,adCmdText
rsTest("имя") = "Китайский"
rsTest.Update
анализировать:
1. В инструкции SQL, если база данных является базой данных Access, дата должна быть заключена в #55-03-04#, как в этом примере, если это база данных SQL Server, дата должна быть заключена в '55-03; -04'.
2. В rsTest.Open StrSQL, Cnn,,,adCmdText, поскольку первый параметр является оператором SQL, пятый параметр — это adCmdText. Фактически пятый параметр можно опустить, но его добавление повысит эффективность выполнения скрипта.
3. Используя первый метод, вы можете одновременно обновить все записи, соответствующие условиям (несколько записей или одну запись), но обновление во втором методе может изменить только текущую запись (первую запись, отвечающую условиям).
3. Удалить данные в базе данных. Способ 1. Используйте операторы SQL. Подпрограмма wuf55.asp
'Часть 2. Использование операторов SQL для удаления данных
Дим StrSQL, rsTest
StrSQL = "УДАЛИТЬ ОТ оператора связи ГДЕ номер телефона = '0571-7227298'"
Cnn.Execute StrSQL
Способ 2. Используйте метод удаления объекта Recordset. Подпрограмма wuf56.asp
'Часть 2. Используйте метод удаления объекта Recordset для удаления данных.
Дим StrSQL, rsTest
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "ВЫБРАТЬ * ОТ оператора связи ГДЕ номер телефона = '0571-7227298'"
rsTest.Open StrSQL, Cnn,,,adCmdText
Пока это не rsTest.EOF
rsTest.Delete
rsTest.MoveNext
Венд
Если в наборе записей есть несколько записей, соответствующих условиям, необходимо использовать цикл. В противном случае метод Удалить удаляет только текущую запись, то есть первую запись, соответствующую условиям.
4. Другие полезные знания
1. Пакетное обновление данных Выше мы говорили о том, как использовать метод Update объекта Recordset для обновления данных. Фактически объект Recordset может поддерживать два типа обновлений: немедленные обновления и пакетные обновления.
При немедленном обновлении все изменения данных будут записаны в текущий источник данных сразу после вызова метода Update.
Пакетные обновления позволяют поставщику кэшировать изменения в нескольких записях, а затем использовать метод UpdateBatch для передачи их в базу данных за один вызов. При обновлении нескольких записей пакетное обновление более эффективно, чем немедленное обновление.
По умолчанию используется режим немедленного обновления. Чтобы использовать режим пакетного обновления, используйте клиентский курсор, например wuf54.asp.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf54.asp
'Часть 2. Режим пакетного обновления
Дим StrSQL, rsTest
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Использовать тип клиентского курсора
rsTest.LockType = adLockBatchOptimistic
StrSQL = "ВЫБРАТЬ * ОТ оператора связи ГДЕ телефон НРАВИТСЯ '%99%'"
rsTest.Open StrSQL, Cnn,,,adCmdText
rsTest.MoveFirst
Пока это не rsTest.EOF
rsTest("Название компании") = "Китайский"
rsTest.MoveNext
Венд
rsTest.UpdateBatch
%>
<HTML>
<ТЕЛО>
<% 'Часть 3: Отображение полученного набора записей в браузере
rsTest.Requery
Делайте, пока не rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Петля
'Часть 4: Зачистка поля боя
Cnn.закрыть
Установить rsTest = Ничего: Установить Cnn = Ничего
%>
</ТЕЛО>
</HTML>
Уведомление:
1) rsTest.CursorLocation = adUseClient имеет два значения, другое значение — adUseServer (по умолчанию). Для новичков тип курсора объекта Recordset представляет собой сложную часть, я не буду описывать его здесь подробно, чтобы не запутаться еще больше. . Пожалуйста, исследуйте фактическую обработку медленно (пробуйте больше).
2) rsTest.Requery: используйте метод Requery для обновления всего содержимого объекта Recordset источника данных. Вызов этого метода эквивалентен последовательному вызову методов Close и Open.
2. Научитесь использовать свойство Filter объекта Recordset.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf57.asp
'Часть 2. Использование свойства Filter объекта Recordset
Дим StrSQL, rsTest
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenStatic
rsTest.LockType = adLockOptimistic
rsTest.Open «Отправитель», Cnn,,,adCmdTable
'Отфильтровывать записи, соответствующие критериям, в то время как другие записи отфильтровываются
rsTest.Filter = "Название компании = 'wu''feng'"
If rsTest.EOF Тогда 'Если такой записи нет, добавьте ее
rsTest.AddNew
rsTest("Название компании") = "wu'feng"
rsTest("Телефон") = "0571-7227298"
rsTest.Update
Else 'Если есть запись, отвечающая условию, измените первую запись, соответствующую условию.
rsTest("Телефон") = "(571) 7227298"
rsTest.Update
Конец, если
%>
<HTML>
<ТЕЛО>
<% 'Часть 3: Отображение полученного набора записей в браузере
«Пожалуйста, внимательно сравните разницу между да и нет в следующем предложении.
'rsTest.Filter="" 'Используется для очистки атрибута фильтра.
rsTest.MoveFirst
Делайте, пока не rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Петля
'Часть 4: Зачистка поля боя
Cnn.закрыть
Установить rsTest = Ничего: Установить Cnn = Ничего
%>
</ТЕЛО>
</HTML>
3. В дополнение к двум методам, представленным выше, вы также можете использовать операторы SQL и метод Excute объекта Command для обслуживания базы данных. Пример wuf58.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf58.asp
'Часть 2. Обслуживание базы данных с помощью операторов SQL и метода Excute объекта Command.
Тусклый StrSQL, rsTest, cmdChange
StrSQL = "ВСТАВИТЬ В грузоотправителя (название компании, номер телефона) ЗНАЧЕНИЯ('wu''feng','0571-7227298')"
'Создать командный объект.
Установите cmdChange =server.CreateObject("ADODB.Command")
Установите cmdChange.ActiveConnection = Cnn
cmdChange.CommandText = СтрSQL
cmdChange.Выполнить
%>
<HTML>
<ТЕЛО>
<% 'Часть 3: Отображение полученного набора записей в браузере
Установите rsTest = server.CreateObject("ADODB.Recordset")
rsTest.Open «Отправитель», Cnn, , , adCmdTable
Делайте, пока не rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Петля
'Часть 4: Зачистка поля боя
Cnn.закрыть
Установить rsTest = Ничего: Установить Cnn = Ничего
%>
</ТЕЛО>
</HTML>
В этой лекции в основном представлены три метода хранения данных. Новичкам достаточно освоить только первые два метода. Вообще говоря, попробуйте использовать инструкции SQL для решения проблем, что является простым и понятным. Самое большое преимущество использования объектов Recordset состоит в том, что вы можете использовать большое количество свойств и богатые типы курсоров, и у вас есть больше возможностей выбора, но это не так. также вызывает некоторые трудности в использовании. Ключ: больше исследовать и больше экспериментировать.