Сообщений 0    Оценка 9        Оценить  
Система Orphus

Как использовать сохранённые процедуры со стандартными CRUDL операциями

Business Logic Toolkit

Автор: Igor Tkachev
The RSDN Group
Опубликовано: 16.01.2006
Исправлено: 17.01.2006
Версия текста: 1.0

Проект BLToolkit

Класс BLToolkit.DataAccess.DataAccessor позволяет использовать набор сохранённых процедур для стандартных CRUDL операций. Следующий пример демонстрирует применений методов Insert, Update, Delete, SelectByKey, SelectAll.

using System;
using System.Collections.Generic;

using NUnit.Framework;

using BLToolkit.DataAccess;
using BLToolkit.Mapping;
using BLToolkit.Reflection;
using BLToolkit.Data;

namespace HowTo.DataAccess
{
    [TestFixture]
    public class CRUDLSproc
    {
        public enum Gender
        {
            [MapValue("F")] Female,
            [MapValue("M")] Male,
            [MapValue("U")] Unknown,
            [MapValue("O")] Other
        }

        public abstract class Person
        {
            [MapField("PersonID"), PrimaryKey, NonUpdatable]
            public abstract int    ID         { get; }

            public abstract string LastName   { get; set; }
            public abstract string FirstName  { get; set; }
            public abstract string MiddleName { get; set; }
            public abstract Gender Gender     { get; set; }

            public static Person CreateInstance()
            {
                return TypeAccessor<Person>.CreateInstanceEx();
            }
        }

        [Test]
        public void InsertTest()
        {
            DataAccessor da = new DataAccessor();

            Person person = Person.CreateInstance();

            person.FirstName = "Crazy";
            person.LastName  = "Frog";
            person.Gender    = Gender.Unknown;

            da.Insert(person);
        }

        [Test]
        public void Test()
        {
            using (DbManager db = new DbManager())
            {
                db.BeginTransaction();

                // Get object.
                //
                Person person = db
                    .SetSpCommand("Person_SelectByName", "Crazy", "Frog")
                    .ExecuteObject<Person>();

                TypeAccessor.WriteConsole(person);
                Assert.IsNotNull(person);

                DataAccessor da = new DataAccessor(db);

                // Update.
                //
                person.Gender = Gender.Other;

                da.Update(person);

                person = da.SelectByKey<Person>(person.ID);

                TypeAccessor.WriteConsole(person);
                Assert.AreEqual(Gender.Other, person.Gender);

                // Delete.
                //
                da.Delete(person);

                person = da.SelectByKey<Person>(person.ID);

                Assert.IsNull(person);

                db.CommitTransaction();

                // Get All.
                //
                List<Person> list = da.SelectAll<Person>();

                foreach (Person p in list)
                    TypeAccessor.WriteConsole(p);
            }
        }
    }
}

SQL скрипт для создания базы данных:

--CREATE DATABASE BLToolkitData ON PRIMARY
--( NAME = N'BLToolkitTest',     FILENAME = N'C:\Data\MSSQL.1\MSSQL\DATA\BLToolkitData.mdf' ,     SIZE = 3072KB , FILEGROWTH = 1024KB )
--LOG ON 
--( NAME = N'BLToolkitTest_log', FILENAME = N'C:\Data\MSSQL.1\MSSQL\DATA\BLToolkitData_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10% )
--GO

-- Person Table

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('Person') AND type in (N'U'))
BEGIN
    DROP TABLE Person
END

CREATE TABLE Person
(
    PersonID   int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_Person PRIMARY KEY CLUSTERED,
    FirstName  nvarchar(50) NOT NULL,
    LastName   nvarchar(50) NOT NULL,
    MiddleName nvarchar(50)     NULL,
    Gender     char(1)      NOT NULL CONSTRAINT CK_Person_Gender CHECK (Gender in ('M', 'F', 'U', 'O'))
)
ON [PRIMARY]
GO

INSERT INTO Person (FirstName, LastName, Gender)
VALUES             ('John',    'Pupkin', 'M')
GO

-- Person_SelectByKey

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_SelectByKey')
BEGIN
    DROP  Procedure  Person_SelectByKey
END
GO

CREATE Procedure Person_SelectByKey
    @id int
AS

SELECT * FROM Person WHERE PersonID = @id

GO

GRANT EXEC ON Person_SelectByKey TO PUBLIC
GO

-- Person_SelectAll

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_SelectAll')
BEGIN
    DROP  Procedure  Person_SelectAll
END
GO

CREATE Procedure Person_SelectAll
AS

SELECT * FROM Person

GO

GRANT EXEC ON Person_SelectAll TO PUBLIC
GO

-- Person_SelectByName

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_SelectByName')
BEGIN
    DROP  Procedure  Person_SelectByName
END
GO

CREATE Procedure Person_SelectByName
    @firstName nvarchar(50),
    @lastName  nvarchar(50)
AS

SELECT
    *
FROM
    Person
WHERE
    FirstName = @firstName AND LastName = @lastName

GO

GRANT EXEC ON Person_SelectByName TO PUBLIC
GO

-- Person_Insert

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_Insert')
BEGIN
    DROP  Procedure  Person_Insert
END
GO

CREATE Procedure Person_Insert
    @FirstName  nvarchar(50),
    @LastName   nvarchar(50),
    @MiddleName nvarchar(50),
    @Gender     char(1)
AS

INSERT INTO Person
    ( LastName,  FirstName,  MiddleName,  Gender)
VALUES
    (@LastName, @FirstName, @MiddleName, @Gender)

SELECT Cast(SCOPE_IDENTITY() as int)

GO

GRANT EXEC ON Person_Insert TO PUBLIC
GO

-- Person_Update

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_Update')
BEGIN
    DROP  Procedure  Person_Update
END
GO

CREATE Procedure Person_Update
    @PersonID   int,
    @FirstName  nvarchar(50),
    @LastName   nvarchar(50),
    @MiddleName nvarchar(50),
    @Gender     char(1)
AS

UPDATE
    Person
SET
    LastName   = @LastName,
    FirstName  = @FirstName,
    MiddleName = @MiddleName,
    Gender     = @Gender
WHERE
    PersonID = @PersonID

GO

GRANT EXEC ON Person_Update TO PUBLIC
GO

-- Person_Delete

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_Delete')
BEGIN
    DROP  Procedure  Person_Delete
END
GO

CREATE Procedure Person_Delete
    @PersonID int
AS

DELETE FROM Person WHERE PersonID = @PersonID

GO

GRANT EXEC ON Person_Delete TO PUBLIC
GO

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add 
            key   = "ConnectionString"
            value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
    </appSettings>
</configuration>


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 0    Оценка 9        Оценить