Олег Баша
Платформа: Windows NT, 2000, XP
Веб-сервер: IIS 4,5
Технологии: ASP, COM, SQL
СУБД: MS SQL Server 7.0 / 2000
Языки: Visual Basic Script, Visual Basic 6.0
Приложения: Microsoft Visual Basic 6.0, MS SQL Server 7.0 / 2000 Enterprise Manager
Основная идея:
Использовать объект, в свойствах которого будут храниться данные, принятые от формы или из базы данных, а методы которого будут выполнять функции чтения данных из БД и записи данных в БД.
Продолжим изучать возможности архитектуры, описанной в "Visual Basic + ASP. Использование шаблонов.". На этот раз мы ознакомимся с основными принципами работы с данными. Мы напишем универсальный код, который будет являться промежуточным звеном между web-интерфейсом пользователя и базой данных.
Запустите Visual Basic и создайте новую ActiveX DLL. Укажите имя проекта - WebSite. Теперь откройте Class Builder Utitlity (эту утилиту можно загрузить с помощью Add-Ins Manager -> Add-Ins -> Add-Ins Manager). Добавьте к проекту новый класс и назовите его Catty. Добавьте следующие свойства к вновь созданному классу:
ID: string
aName: string
aDol: string
aTel: string
aEmail: string
Закройте Class Builder Utility. Откройте окно Project Preferences и добавьте к проекту Microsoft ActiveX Data Objects Library.
Листинг 1. Класс CAtty.
'local variable(s) to hold property value(s)
Private mvarId As String 'local copy
Private mvaraName As String 'local copy
Private mvaraTel As String 'local copy
Private mvaraEmail As String 'local copy
Private mvaraDol As String 'local copy
Public Property Let aDol(ByVal vData As String)
'Syntax: X.aDol = 5
mvaraDol = vData
End Property
Public Property Get aDol() As String
'Syntax: Debug.Print X.aDol
aDol = mvaraDol
End PropertyPublic Property Let aEmail(ByVal vData As String)
'Syntax: X.aEmail = 5
mvaraEmail = vData
End Property
Public Property Get aEmail() As String
'Syntax: Debug.Print X.aEmail
aEmail = mvaraEmail
End Property
Public Property Let aTel(ByVal vData As String)
'Syntax: X.aTel = 5
mvaraTel = vData
End Property
Public Property Get aTel() As String
'Syntax: Debug.Print X.aTel
aTel = mvaraTel
End Property
Public Property Let aName(ByVal vData As String)
'Syntax: X.aName = 5
mvaraName = vData
End Property
Public Property Get aName() As String
'Syntax: Debug.Print X.aName
aName = mvaraName
End Property
Public Property Let ID(ByVal vData As String)
'Syntax: X.Id = 5
mvarId = vData
End Property
Public Property Get ID() As String
'Syntax: Debug.Print X.Id
ID = mvarId
End Property
Теперь добавьте к исходному коду полученного класса эти функции:
Листинг 2. Функции для работы с данными.
Public Function DelObjectFromDB(ID As Variant)
Dim SQL$
SQL = "DELETE FROM dbo.tbl_atty WHERE ID='" & ID & "'"
db_conn.Execute (SQL)
End Function
Public Function LoadObjectFromDB(ID As Variant) As CAtty
Dim SQL$
SQL = "SELECT ALL * FROM attyDB..tbl_atty(NOLOCK) & _
" WHERE Id='" & ID & "'"
Set rs = New ADODB.Recordset
Set rs = db_conn.Execute(SQL)
If rs.EOF And rs.BOF Then
GoTo CLEAN_UP
Else
ID = rs("ID")
aName = rs("aName")
aDol = rs("aDol")
aTel = rs("aTel")
aEmail = rs("aEmail")
End If
CLEAN_UP:
Set rs = Nothing
Set LoadObjectFromDB = Me
End Function
Public Function
SetRequestIntoObject(Request As Variant) As CAtty
ID = Request.Form("ID")
aName = Request.Form("Name")
aDol = Request.Form("Dol")
aTel = Request.Form("Tel")
aEmail = Request.Form("Email")
Set SetRequestIntoObject = Me
End Function
Public Function SetObjectIntoDB(oAtty As CAtty) As String
Dim SQL$
With oAtty
SQL = "DELETE FROM attyDB..tbl_atty WHERE ID='" & _
.ID & "'" & vbCrLf
SQL = SQL & "INSERT INTO attyDB..tbl_atty "
SQL = SQL & "(ID, aName, aDol, "
SQL = SQL & "aTel, aEmail)"
SQL = SQL & " VALUES ("
SQL = SQL & "'" & .ID & "', "
SQL = SQL & "'" & .aName & "', "
SQL = SQL & "'" & .aDol & "', "
SQL = SQL & "'" & .aTel & "', "
SQL = SQL & "'" & .aEmail & "')"
End With
db_conn.Execute SQL
SetObjectIntoDB = Err.Number
End Function
Добавленные нами функции выполняют следующие операции:
- Копирование полученных от формы данных из объекта Request в свойства объекта Catty;
- Запись в базу данных информации, хранящейся в объекте Catty;
- Чтение из базы данных и заполнение свойств объекта Catty;
- Удаление записей из базы данных.
Добавьте к Вашему проекту модуль и назовите его system. Скопируйте в модуль код из листинга 3.
Листинг 3. Модуль System
Const DB_Connection_String = "DSN=attyDB"
Public db_conn As New ADODB.Connection
Public rs As ADODB.Recordset
Public TEMPLATE_PATH As String
Public Function
getTemplateFile(sFileName As String) As String
Dim fso As Object, f As Object
Dim sFile$
If Right(TEMPLATE_PATH, 1) <> "" Then
TEMPLATE_PATH = TEMPLATE_PATH & ""
End If
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(TEMPLATE_PATH & sFileName, 1)
sFile = f.ReadAll()
Set f = Nothing
Set fso = Nothing
getTemplateFile = sFile
End Function
Public Sub OpenDBConnection()
If db_conn.State = adStateClosed Then
db_conn.Provider = "SQLOLEDB"
db_conn.Open DB_Connection_String, "sa", ""
End If
End Sub
Public Sub CloseDBConnection()
If db_conn.State = adStateOpen Then db_conn.Close
End Sub
В этом модуле содержатся константы, необходимые для соединения с базой данных, процедуры открытия и закрытия соединения, а так же функция открытия файла шаблона, использующегося в нашем примере.
Теперь добавьте к вашему проекту класс Cmain.
Листинг 4. Класс Cmain.
Public Function GetPage(Session, Request) As String
Dim sPageBack$
Dim ContentFileName As String
Dim Atty As New CAtty
Dim Error As String
If Request.Form("Flag") = "On" Then
Error = Atty.SetObjectIntoDB(
Atty.SetRequestIntoObject(Request))
End If
sPageBack = getTemplateFile("template.htm")
sPageBack = Replace(sPageBack, "{$Title$}",
"Пример использования шаблонов")
Set Atty = Atty.LoadObjectFromDB("1")
sPageBack = Replace(sPageBack, "{$Name$}", Atty.aName)
sPageBack = Replace(sPageBack, "{$Dol$}", Atty.aDol)
sPageBack = Replace(sPageBack, "{$Tel$}", Atty.aTel)
sPageBack = Replace(sPageBack, "{$Email$}", Atty.aEmail)
GetPage = sPageBack
End Function
Private Sub Class_Initialize()
TEMPLATE_PATH = App.Path
Call OpenDBConnection
End Sub
Private Sub Class_Terminate()
Call CloseDBConnection
End Sub
Этот класс содержит единственную функцию GetPage. Эта функция вызывается из asp-страницы, ей передаются основные asp-объекты, она производит запись, чтение из БД и возвращает результат этих операций в asp-страницу.
Откомпилируйте и зарегистрируйте полученную DLL.
Теперь запустите Enterprise Manager Вашего SQL сервера. Создайте новую базу данных attyDB и создайте в ней таблицу tbl_atty с полямиID: nvarchar(5)
aName: nvarchar(50)
aDol: nvarchar(50)
aTel: nvarchar(50)
aEmail: nvarchar(50)
В нашем примере мы соединяемся с базой данных под логином системного администратора ("sa"). Вы можете создать нового пользователя, только тогда не забудьте внести соответствующие изменения в значение константы db_connection_string. Также не забудьте указать permissions у таблицы tbl_atty для нового пользователя. В заключение создания новой базы данных создайте системный DNS с именем attyDB.
Теперь подготовим интерфейс пользователя. Мы создадим пример, скорее, просто наглядный, чем функциональный. Думаю, Вам не составит труда адаптировать вышеизложенные идеи к структуре Вашего приложения.
Для простоты, мы пока будем работать только с одной записью. Мы создадим форму, которая при первом открытии будет иметь пустые поля, а после первого сохранения она будет заполнена введенными Вами данными, доступными для редактирования. Вводимые данные будут сохраняться в базе данных. Мы сохраним идеологию, описанную нами на первом шаге, т.е. будем использовать шаблон. Создайте страницу template.htm, скопировав в нее код, приведенный в листинге 5.
Листинг 5. template.htm.
<html>
<head>
<title>{$Title$}</title>
</head>
<body>
<!-- Здесь html-код разметки страницы -->
<form action="index.asp" method="post">
<input type="hidden" name="Flag" Value="On">
<input type="hidden" name="Id" Value="1">
<table>
<tr><td colspan="2" bgcolor="#CCCCCC">Новый сотрудник</tr>
<tr>
<td>Имя:</td>
<td><input type="text" name="Name" value="{$Name$}"></td>
</tr>
<tr>
<td>Должность:</td>
<td><input type="text" name="Dol" value="{$Dol$}"></td>
</tr>
<tr>
<td>Телефон:</td>
<td><input type="text" name="Tel" value="{$Tel$}"></td>
</tr>
<tr>
<td>e-mail:</td>
<td><input type="text" name="Email" value="{$Email$}"></td>
</tr>
</table>
<input type=submit value="Сохранить">
</form>
-- данные в БД --
<table>
<tr>
<td>Имя:</td>
<td>{$Name$}</td>
</tr>
<tr>
<td>Должность:</td>
<td>{$Dol$}</td>
</tr>
<tr>
<td>Телефон:</td>
<td>{$Tel$}</td>
</tr>
<tr>
<td>e-mail:</td>
<td>{$Email$}</td>
</tr>
</table>
<!-- Здесь html-код разметки страницы -->
</body>
</html>
Создайте страницу index.asp, ее код в листинге 6.
Листинг 6. index.asp.
<% @ Language="VBScript" %>
<%
Dim obj
Dim RetVal
set obj = Server.CreateObject("WebSite.CMain")
RetVal = obj.GetPage(Session, Request)
set obj = Nothing
Response.Write(RetVal)
%>
Убедитесь, что Ваш объект откомпилирован, SQL-сервер запушен, все файлы (объект, шаблоны и asp-страницы) находятся в одной папке. Это не обязательно, и, даже, не рекомедуется в рабочих проектах, просто пока так Вам удастся избежать лишних ошибок. Убедитесь, что к этой папке открыт доступ. Откройте в браузере страницу http://ваш_домен/ваш_виртуальный_каталог/index.asp.
ВСЁ!
Из приведенного примера важно усвоить:
- Удобство использования классов,
- Принцип обмена данными с базой данных.