Visual Basic + ASP. Работа с данными - Запись, чтение (исходники)

Источник: olevarty
Олег Баша

Платформа: 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.

ВСЁ!

Из приведенного примера важно усвоить:

  • Удобство использования классов,
  • Принцип обмена данными с базой данных.

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=1988