65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 数据类

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (7投票s)

2002年1月28日

2分钟阅读

viewsIcon

143010

downloadIcon

1271

一个用于调用参数化存储过程的通用方法。

引言

好的,已经有大量的C#数据类了,但是这个类的编码使其尽可能可重用。大部分代码非常直接:唯一需要解释的部分是TParams结构。

public struct TParams
{
    public TParams(string inName,int inSize,System.Data.SqlDbType inDataType,object inValue)
    {
        this.dtDataType=inDataType;
        this.Name=inName;
        this.oValue=inValue;
        this.Size=inSize;
    }
    public string Name;
    public int Size;
    public System.Data.SqlDbType dtDataType;
    public object oValue;
}

尝试创建一个通用的函数,您可以使用它来调用带参数的存储过程,这是一个更困难的设计目标。如果仅仅是名称-值配对,那将很容易,但是为了正确准备存储过程的执行,需要传递大量信息到数据库(即参数名称、参数数据类型、参数值、参数方向)。在ADO 2.5及以下版本中,往往会忽略大部分准备工作,而仅仅依赖ADO提供的默认值。虽然这有效,但这肯定不是最佳实践,因为ADO只能猜测您的确切需求。

在非类型化环境(ASP)中,解决这个问题的方法可能是使用数组,在VB中,可能使用某种类型的数组。这就是这里使用的解决方案。准备一个TParams类型的数组并将其与存储过程名称一起传递给函数。

   System.Data.DataSet Rs = cDat.DIRunSPretDs
        (
        new DatTools.cDB.TParams[] 
                {
                   new DatTools.cDB.TParams("@country", 100, 
                        System.Data.SqlDbType.VarChar, 
                            "Germany")
                   } 
        ,"sp_Test"
        );

在此代码片段中,调用了DIRunSPretDs函数,返回一个数据集。在**第3行**,创建了一个TParams类型的内联临时数组。**第5-7行**创建了一个TParams类型的内联临时对象,它表示此(sp_Test)存储过程的一个参数。使用类型而不是paramarray结构的优点是编译时类型安全以及智能感知。已经为TParams结构提供了一个重载来简化参数传递。

限制

虽然这种机制很有用并且提供了良好的功能,但它没有提供的一点是输出参数。这是一个基于几个事实的设计决策

  • Microsoft建议从存储过程返回标量值是首选方法。
  • 返回多个输出值不如返回包含这些值的记录集高效。
  • SQL Server有一种很好的方法来返回错误。这可以与Transact-SQL一起使用:sp_addmessageRAISERROR

结论

这是一种黑盒化功能并允许其他开发人员在不知道实现细节的情况下重用的方法(基本的OO原则)。虽然数据类很简单,但它确实允许轻松编写客户端代码,并实现了此项目的目标,即SourceForge上的OSDN代码生成。

© . All rights reserved.