| Модератор /*ASP*/
Специализация: Кодер Регистрация: 17.07.2008 Адрес: Город-герой Подольск Сообщений: 145 Репутация: 67 | asp.net БД - это легка! Добавим динамики! Копирование данного материала запрещено без письменного разрешения автора. Добрый день читатель! Сегодня мы рассмотрим создание WebService, ScriptServiceи использование некоторых Data-компонентов. И так приступим. Для начала я приведу код модулей доступа к БД, немного измененный с последнего раза Оффтоп Изменение коснулось только получения DataSetи IDновой записи. Ничего существенного.
Код SQLDataBase.vb Оффтоп Код: Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Public Class SQLDataBase
Inherits MarshalByRefObject
Enum SQLVariant
SqlSelect = 1
SqlUpLoad = 2
SqlDelete = 3
End Enum
Dim strSelect As String
Dim strConnetction As String = "Server=.\SQLExpress;database=test;Trusted_Connection=yes;"
Dim MyConnection As New SqlConnection(strConnetction)
Dim MySqlDataAdapter As New SqlDataAdapter()
Dim MySqlCommandBuilder As New SqlCommandBuilder()
Dim WorkDataSet As Data.DataSet
Public Function SqlMethods(ByVal [SqlVariant] As SQLVariant, ByRef [DataSet] As Data.DataSet, ByVal SelectString As String, Optional ByVal strSelectNewID As String = "") As Integer
Dim result As Integer = 0
strSelect = SelectString
WorkDataSet = [DataSet]
MySqlDataAdapter = New SqlDataAdapter(strSelect, MyConnection)
MySqlCommandBuilder.DataAdapter = MySqlDataAdapter
MySqlCommandBuilder.ConflictOption = Data.ConflictOption.OverwriteChanges
If [SqlVariant] = SQLDataBase.SQLVariant.SqlSelect Then
SqlMethodSelect()
[DataSet] = WorkDataSet
Return result
End If
MySqlDataAdapter.UpdateCommand = MySqlCommandBuilder.GetUpdateCommand(True)
MySqlDataAdapter.InsertCommand = MySqlCommandBuilder.GetInsertCommand(True)
MySqlDataAdapter.DeleteCommand = MySqlCommandBuilder.GetDeleteCommand(True)
Select Case [SqlVariant]
Case SQLDataBase.SQLVariant.SqlDelete
Dim i As Integer
SqlMethodSelect()
If WorkDataSet Is Nothing Then
result = -1
[DataSet] = WorkDataSet
Return result
End If
For i = 0 To WorkDataSet.Tables(0).Rows.Count - 1
WorkDataSet.Tables(0).Rows(i).Delete()
Next
SqlMethodUpLoad()
Case SQLDataBase.SQLVariant.SqlUpLoad
SqlMethodUpLoad()
[DataSet] = New Data.DataSet
SqlMethods(SQLDataBase.SQLVariant.SqlSelect, [DataSet], strSelectNewID)
result = WorkDataSet.Tables(0).Rows(0)(0)
End Select
[DataSet] = WorkDataSet
Return result
End Function
Private Sub SqlMethodSelect()
Try
MyConnection.Open()
Catch ex As Exception
End Try
Try
MySqlDataAdapter.Fill(WorkDataSet)
MyConnection.Close()
Catch ex As Exception
WorkDataSet = Nothing
MyConnection.Close()
End Try
End Sub
Private Sub SqlMethodUpLoad()
Try
MyConnection.Open()
Catch ex As Exception
End Try
Try
MySqlDataAdapter.Update(WorkDataSet)
MyConnection.Close()
Catch ex As Exception
WorkDataSet = Nothing
MyConnection.Close()
End Try
End Sub
End Class
Код для TestTable.vb Оффтоп Код: Imports Microsoft.VisualBasic
Imports System.Data.SqlClient
Public Class TestTable
Public Function TestMethods(ByVal [SqlVariant] As SQLDataBase.SQLVariant, Optional ByRef [DataSet] As Data.DataSet = Nothing, Optional ByVal strKey As String = "NULL") As Data.DataSet
Dim TableName As String
Dim RecordIDFieldName As String
Dim ID As Integer
TableName = "Test1"
RecordIDFieldName = "lngTestID"
ID = doSQl([SqlVariant], [DataSet], TableName, RecordIDFieldName, strKey)
Return [DataSet]
End Function
Public Sub getTestSum(Optional ByRef [DataSet] As Data.DataSet = Nothing, Optional ByVal strKey As String = "NULL")
Dim strSelect As String
strSelect = "select count(*) from test1"
If strKey <> "NULL" Then
strSelect = strSelect + " WHERE lngTestID=" & strKey
End If
doSQlStatment([DataSet], strSelect)
End Sub
Private Function doSQl(ByVal [SqlVariant] As SQLDataBase.SQLVariant, ByRef [DataSet] As Data.DataSet, ByVal TableName As String, ByVal RecoredIDFieldName As String, Optional ByVal strKey As String = "NULL") As Integer
Dim a As New SQLDataBase
Dim strSelect As String
Dim selectNewId As String
strSelect = "select * from " & TableName
selectNewId = "SELECT MAX(" & RecoredIDFieldName & ") FROM " & TableName
If strKey <> "NULL" Then
strSelect = strSelect + " WHERE " & RecoredIDFieldName & "=" & strKey
End If
If [DataSet] Is Nothing Then
[DataSet] = New Data.DataSet
End If
Return a.SqlMethods([SqlVariant], [DataSet], strSelect, selectNewId)
End Function
Private Function doSQlStatment(ByRef [DataSet] As Data.DataSet, ByVal strSelect As String) As Integer
Dim a As New SQLDataBase
If [DataSet] Is Nothing Then
[DataSet] = New Data.DataSet
End If
Return a.SqlMethods(SQLDataBase.SQLVariant.SqlSelect, [DataSet], strSelect)
End Function
End Class Напишем небольшой WebService, который будет возвращать DataSetсо всеми данными из таблицы. Код:
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class TestTableFetcher
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function getTestList() As Data.DataSet
Dim da As New TestTable
Return da.TestMethods(SQLDataBase.SQLVariant.SqlSelect)
End Function
End Class Теперь добавляем на default.aspx2 контролла. ObjectDataSourceи GridView. Привязывает источник данных к нашему сервису, а GridViewк источнику данных. Код: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="XHTML namespace" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getTestList" TypeName="TestTableFetcher"></asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1">
</asp:GridView>
</div>
</form>
</body>
</html> Запускаем. Все данные из таблицы отобразились у нас на страничке. Только как-то не красиво, да и не все данные нам нужны. Начинаем настраивать объект GridView Код: <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="lngTestID" HeaderText="Номер" />
<asp:BoundField DataField="strName" HeaderText="Название" />
<asp:TemplateField HeaderText="Название">
<ItemTemplate>
<span>Ухты!</span>
<asp:Label ID="lbl_Name" runat="server" Text=<%# eval("strName") %> ></asp:Label>
<br />
<asp:Label ID="lbl_Chet" runat="server" Text=<%# CanDo(eval("lngTestID")) %> ></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView> Сейчас у нас используется 2 вида столбцов : asp:BoundField и asp:TemplateField Первый – стандартный, для простого отображения (в GridViewих несколько видов, легко изучить их все самостоятельно) Второй (на нем мы остановимся по подробней) – столбец собственного содержания. Как видно из примера данные к нему привязываются командой Eval(«Название столбца»). В TemplateField можно «пихать» любые элементы и почти ко всем свойствам привязывать данные, насколько хватит фантазии. Во 2ом TemplateField я использую еще и серверную функцию CanDo. Код: Function CanDo(ByVal lngId As String) As String
Try
Dim ID As Integer = CInt(lngId)
If ID Mod 2 = 0 Then
Return "Чёт блин"
Else
Return "Нечет"
End If
Catch ex As Exception
Return "Хозяина ты не права"
End Try
End Function CanDoвозвращает некоторые значения в зависимости от IDзаписи. Как видите все легко и понятно. Очень удобно в зависимости от какого-то «ключика» ставить элементу visibleв trueили false. С этим разобрались. Учищаем страничку. WebService– отличается от WebServiceтолько тем, что его можно «вызывать» из скрипта. Обычный код VB.NET(на чем у нам написан модуль для доступа к БД) , будет вызываться из скрипта. Посмотрим, что из этого можно извлечь. Добавим в web.config несколько строчек Код: <system.web>
<compilation debug="true" strict="false" explicit="true">
<assemblies>
<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</pages>
<httpHandlers>
<remove path="*.asmx" verb="*"/>
<add path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
<add path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
<add path="ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
<add path="CrystalImageHandler.aspx" verb="GET" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.2.3600.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
</system.web> Добавимобычный WebService, назовемего ScriptService(уберитегалочку Place code in separate file) Код: <%@ WebService Language="VB" Class="ScriptService1.Test1" %>
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Web.Script.Services
Namespace ScriptService1
<WebService(Namespace:="Index of /")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ScriptService()> _
Public Class Test1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function getPeopleList()
Dim Arr(,) As String
ReDim Arr(1, 3)
Arr(0, 0) = "0"
Arr(1, 0) = "Школьник"
Arr(0, 1) = "1"
Arr(1, 1) = "Студент"
Arr(0, 2) = "2"
Arr(1, 2) = "Работник"
Arr(0, 3) = "3"
Arr(1, 3) = "Программист"
Return Arr
End Function
<WebMethod()> _
Public Function getDoList(ByVal IDPeople)
Dim Arr(,) As String
ReDim Arr(1, 1)
Select Case IDPeople
Case 0
Arr(0, 0) = "0"
Arr(1, 0) = "учиться"
Arr(0, 1) = "1"
Arr(1, 1) = "играть на PC"
Case 1
Arr(0, 0) = "0"
Arr(1, 0) = "пить пиво"
Arr(0, 1) = "1"
Arr(1, 1) = "любить девочек"
Case 2
Arr(0, 0) = "0"
Arr(1, 0) = "работать"
Arr(0, 1) = "1"
Arr(1, 1) = "любить жену"
Case 3
Arr(0, 0) = "0"
Arr(1, 0) = "перекодировка пива в код"
Arr(0, 1) = "1"
Arr(1, 1) = "пить пиво"
End Select
Return Arr
End Function
End Class
End Namespace В коде можно (чаще нужно!) использовать данные из БД, но для теста хватит и имитации. Теперь осталось сделать страничку с небольшим кодом, которые подгружает данные из сервиса и добавляет их в select. Код: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="XHTML namespace" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true" EnableScriptGlobalization="true" ScriptMode="Auto">
<Services>
<asp:ServiceReference Path="ScriptService.asmx" />
</Services>
</asp:ScriptManager>
<div>
<select id="Select1" onclick="LoadSelect2();">
</select>
<select id="Select2" onclick="ShowSelected();">
</select>
<br />
<span id="txt"></span>
</div>
</form>
</body>
<script>
function LoadSelect1()
{
ScriptService1.Test1.getPeopleList(ReturnValuesForSelect1);
}
function ReturnValuesForSelect1(result)
{
addValueToSelect(document.getElementById("Select1"),result);
}
function LoadSelect2()
{
var obj=document.getElementById("Select1");
document.getElementById("txt").innerText=""
ScriptService1.Test1.getDoList(obj.options[obj.selectedIndex].value,ReturnValuesForSelect2);
}
function ReturnValuesForSelect2(result)
{
addValueToSelect(document.getElementById("Select2"),result);
}
function addValueToSelect(objSel,result)
{
var sum;
objSel.options.length = 0;
for (var i=0;i<result.length/2;i++)
{
sum=i+result.length/2;
objSel.options[objSel.options.length] = new Option(result[sum],result[i]);
}
}
function ShowSelected()
{
var objTxt=document.getElementById("txt");
var obj=document.getElementById("Select1");
var obj1=document.getElementById("Select2");
objTxt.innerText="Вы " + obj.options[obj.selectedIndex].text + " любящий " + obj1.options[obj1.selectedIndex].text
}
</script>
<script Спасибо читатель за уделенное время и …. …Лучшие знания достаются с мозолями на пальцах (с) desant
__________________ Интелект - величина постоянная.
А количество людей все время возрастает... Журнал по миру web-a
Последний раз редактировалось desant; 27.08.2008 в 16:02.
|