c#中单个存储过程中的crud操作

时间:2016-01-26 07:41:02

标签: c# sql

public class ClientOfPdfObject<T> where T: PdfObject
{
    public List<T> GetItems()
    {
        List<PdfObject> list = GetList();
        var result = new List<T>();
        foreach (var pdfObject in list)
        {
            if (typeof (T) == pdfObject.GetType())
                result.Add((T) pdfObject);
        }
        return result;
    }

    //Get PdfObjects somewhere (ex. Db)
    private List<PdfObject> GetList()
    {
        var list = new List<PdfObject>
        {
            new PdfImage(),
            new PdfImage(),
            new PdfImage(),
            new PdfText(),
            new PdfText(),
            new PdfText(),
            new PdfText()
        };

        return list;
    }
}


static void main()
{
        var text = new ClientOfPdfObject<PdfText>();
        //contains 4 itmes (PdfText)
        var pdfTexts = text.GetItems();

        var image = new ClientOfPdfObject<PdfImage>();
        //contains 3 items (PdfImage)
        var pdfImages = image.GetItems();
}

和使用存储过程访问数据的代码:

ALTER PROCEDURE dbo.bicrudlogin 
    (
    @id int,
    @username nvarchar(50),
    @password nvarchar(50),
    @type varchar(50),
    @status varchar(50)
    )   
AS
if(@status='insert')
Begin   
insert into tbllogin  values(@username,@password,@type)
End

if(@status='select')
Begin   
select type from tbllogin where username=@username and password=@password
End

if(@status='update')
Begin   
update tbllogin set username=@username,password=@password,type=@type  where id=@id
End

if(@status='delete')
Begin   
delete from tbllogin where id=@id
End 

RETURN

如果这是错误的方式,那么告诉我该怎么做。

而不是为每个操作编写单独的存储过程。

1 个答案:

答案 0 :(得分:0)

哇,如果这是生产代码,那么我真的很担心,但这是一个非常广泛的问题,我会尽力回答。通常,您会将您的读写问题分开,例如:

public interface IGetUserQuery
{
    User Execute(string username, string password);
}

public class GetUserQuery : IGetUserQuery
{
    public User Execute(string username, string password)
    {
        // your code
    }
}

CREATE PROCEDURE uspGetUser (@username nvarchar(50),@password nvarchar(50))
AS
select type from tbllogin where username=@username and password=@password

public interface IAddUserCommand 
{
    void Execute(string username, string password, string type);
}

public class AddUserCommand : IAddUserCommand 
{
   public void Execute(string username, string password, string type)
   {
       // your code
   }
}

CREATE PROCEDURE uspAddUser (@username nvarchar(50),@password nvarchar(50),@type varchar(50),@status varchar(50))
AS
insert into tbllogin  values(@username,@password,@type)

这是如何获取用户的示例。但为什么这么精细?简单的答案是,这允许您对代码进行单元测试,即mock您希望从查询中获得的内容并驱动软件的行为。您的存储过程应该是愚蠢的,并作为获取和转储数据的手段。你所拥有的逻辑应放在代码中。当它位于存储过程中时,这变得更难以维护并且经常导致更大的问题,因为您不知道有多少组件,即您的软件的一部分正在使用该sproc。如果进行微小更改,可能会影响多个组件。通过代码,您可以找到这个,因为如果您更改合同,您将收到编译错误。您也希望单元测试覆盖率也能找到问题。