DHJJ DHJJ [Hatsune's Journal Japan]

ASP.NET MVC 3 BetaでOracleアプリを作ろう

ASP.NET MVC 3 BetaでOracleアプリを作ろう~大阪編

01

Oracle Databaseについて

バージョンとEdition

04

Oracleの開発環境を入手

05

Oracleってチューニング大変だよね?

06

ASP.NET MVCについて

ASP.NET MVC 2 について

08

ASP.NET MVC 2 - プロジェクト構成

09

ASP.NET MVC 2 - 処理の流れ

10

ASP.NET MVC 2は単体テストがしやすい

11

ModelsにはModelクラスとServiceクラスを実装する

12

ASP.NET MVC + Oracle

ASP.NET MVC 3 Beta + ODP.NET

14

MVCのOracle対応はModelsだけ書き換えればOK

15

Models - AccountMemebershipServiceの変更
Public Function ValidateUser(ByVal userName As String,
                             ByVal password As String) _
                         As Boolean Implements IMembershipService.ValidateUser
    Dim isOK As Boolean = False

    If String.IsNullOrEmpty(userName) Then
        Throw New ArgumentException("Value cannot be null or empty.", "userName")
    End If
    If String.IsNullOrEmpty(password) Then
        Throw New ArgumentException("Value cannot be null or empty.", "password")
    End If

    Using _cn As New Oracle.DataAccess.Client.OracleConnection
        Try
            _cn.ConnectionString = String.Format(AppSettings("ConnectionString"),userName,password)
            _cn.Open()
            isOK = True
        Catch ex As Exception
        End Try
    End Using
    Return isOK
End Function

ASP.NET MVC 3の注目ポイント

19

View Engine (Razor)

20

Dynamic View and ViewModel Properties

21

JsonValueProvideFactory(ValueProviderFactory)

22

JSONを使うWindowsアプリ

サーバー側はASP.NET MVC 3で作成してあります。

EmpComtrollerでEmpModelsのGetRecordsの処理結果をJson形式に変換してhttpリクエストのレスポンスとして呼び出し元のクライアントに戻します。

<HandleError()>
Public Class EmpController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Emp
    
    Public Overridable Function Index() As JsonResult
        Dim userID As String = "scott"
        Dim password As String = "tiger"
        Return Json((New EmpModels).GetRecords(userID, password),
                    JsonRequestBehavior.AllowGet)
    End Function
End Class

EmpModelsは単体テストのMockが作りやすいようにInterfaceとして戻り値がList(Of TEmp)のgetRecordsメソッドを定義しています。

実処理側ではSELECT文の結果をDataTableに格納した後にList(Of TEmp)の戻り値に格納しなおしています。他にも方法はありますが説明の都合で今回はこのようなコードになっています。

Public Interface IEmpService
    Function GetRecords(ByVal userName As String,
                        ByVal password As String) As List(Of TEmp)
End Interface

Public Class EmpModels
    Implements IEmpService

    Private block As Object
    Public Function GetRecords(ByVal userName As String,
                               ByVal password As String) _
                           As List(Of TEmp) Implements IEmpService.GetRecords
        Dim ds As New DataSet
        Dim empList As New List(Of TEmp)

        Using _cn As New Oracle.DataAccess.Client.OracleConnection
            Try
                _cn.ConnectionString = String.Format(System.Configuration.ConfigurationManager.AppSettings("ConnectionString"),
                                                     userName,
                                                     password)
                _cn.Open()
                Using _cmd As New Oracle.DataAccess.Client.OracleCommand
                    _cmd.Connection = _cn
                    _cmd.CommandText = "SELECT * FROM SCOTT.EMP ORDER BY EMPNO"
                    Using _da As New Oracle.DataAccess.Client.OracleDataAdapter
                        _da.SelectCommand = _cmd
                        _da.Fill(ds, "EMP")
                    End Using
                End Using
            Finally
                _cn.Close()
            End Try
        End Using
        For Each row As DataRow In ds.Tables("EMP").Rows
            Dim empItem As New TEmp
            empItem.EmpNo = CType(row("EMPNO"), Integer)
            empItem.EName = CType(row("ENAME"), String)
            empItem.Job = CType(row("JOB"), String)
            empList.Add(empItem)
        Next
        Return empList
    End Function
End Class

Public Class TEmp
    <Required()>
    Public Property EmpNo As Integer
    <Required()>
    Public Property EName As String
    <Required()>
    Public Property Job As String
End Class

クライアント側のコードのキモはSystem.Web.Script.Serialization.JavaScriptSerializerによりサーバー側から送信されてきたJSON形式の文字列をList(Of TEmp)形式にデシリアライズして格納しているところです。

Public Class JsonClient_Form
    Private Sub Get_Button_Click(ByVal sender As System.Object,
                                 ByVal e As System.EventArgs) _
                             Handles Get_Button.Click
        Using webs As New System.Net.WebClient
            Dim result As Byte() = webs.DownloadData("http://localhost:1100/emp/index/")
            Dim jsonString As String = Encoding.UTF8.GetString(result)
            Dim serializer = New System.Web.Script.Serialization.JavaScriptSerializer
            Dim jsonData As List(Of TEmp) = serializer.Deserialize(Of List(Of TEmp))(jsonString)
            Me.ListBox1.Items.Clear()
            For index As Integer = 0 To jsonData.Count - 1
                Me.ListBox1.Items.Add(jsonData(index).EmpNo.ToString)
            Next
        End Using
    End Sub
End Class
Public Class TEmp
    Public Property EmpNo As Integer
    Public Property EName As String
    Public Property Job As String
End Class
JSONを使うWindows Phone 7アプリ

Windows Phone 7用の.NET FrameworkにはSystem.Web.Script.Serialization.JavaScriptSerializerがありません。

そこでcodeplexのService4u2で提供されているWP7用のJSONライブラリを使用することにします。

Public Class EmpListService
    Inherits Service4u2.Json.BaseJsonService(Of List(Of TEmp))
    Public Sub GetEmpListAsync()
        Dim helper As New Service4u2.Json.ServiceUrlHelper("http://localhost.:1100")
        Dim urlString As String = helper.GetControllerActionParameterUrl("Emp", "Index")

        Call MyBase.StartServiceCall(urlString)
    End Sub
End Class

Public Class TEmp
    Public Property EmpNo As Integer
    Public Property EName As String
    Public Property Job As String
End Class
ASP.NET MVC 3 Beta + Oracle Providers for ASP.NET

25

こんなシステム構成が流行るかも

26

COPYRIGHT (C) 2008 初音玲 All rights reserved. / Running .NET Framework 4.0.30319.42000