JScript .NETVisual Studio .NET 2002.NET 1.0Visual Studio .NET 2003.NET 1.1IntermediateDevVisual StudioWindows.NETVisual BasicC#
VB、C# 和 JScript.NET 的存储过程调用代码生成器






4.92/5 (22投票s)
2002 年 11 月 5 日
8分钟阅读

394489

3370
VB、C# 和 JScript.NET 的存储过程调用代码生成器
详细文档(包括教程)已在 spinvoke_v2_1.pdf 中提供,该文件包含在下载内容中。
摘要
SP/Invoke 生成的代码允许 C#、VB 或 JScript.NET 程序员像调用 CLR 类的静态方法一样调用 SQL Server 存储过程。这是 objectnation 提交给 Chris Sell 的 'Spend a Day With .NET' 竞赛的项目,并赢得了“最佳 SQL 应用”奖(点击 此处 了解获奖者信息)。此处介绍的版本包含最初提交后进行的许多改进。
解决的问题/应用技术
此代码可作为以下方面的有用示例
- 使用 CodeDOM 进行代码生成。
- Visual Studio .NET 自定义生成工具开发(代码最初来自 Chris Sell 的 XsdClassesGen 工具(链接 此处)。
- 检查 SQL Server 元数据。
示例用法
例如,对于以下存储过程(取自 Northwind SQL Server 示例数据库)...
CREATE PROCEDURE CustOrderHist @CustomerID nchar(5)
AS
SELECT
ProductName,
Total=SUM(Quantity)
FROM
Products P,
[Order Details] OD,
Orders O,
Customers C
WHERE
C.CustomerID = @CustomerID AND
C.CustomerID = O.CustomerID AND
O.OrderID = OD.OrderID AND
OD.ProductID = P.ProductID
GROUP BY
ProductName
...在您的 C#/VB 项目中定义一个 XML 文件,并描述应为其生成代码的存储过程...
<?xml version="1.0" encoding="UTF-8" ?>
<storedProcedures>
<server name="localhost">
<database name="Northwind">
<storedProcedureClass source="CustOrderHist">
<rowClass></rowClass>
</storedProcedureClass>
</database>
</server>
</storedProcedures>
然后,您将 XML 文件与 SP/Invoke 相关联
SP/Invoke 生成代码...
...并将其添加到项目中...
...允许您使用以下方式调用存储过程...
SqlConnection conn = new SqlConnection("...");
conn.Open();
CustOrderHist.Result r = CustOrderHist.Invoke(conn, "OTTIK");
if (r.ReturnValue != 0)
return;
foreach (CustOrderHist.Row order in r)
{
Console.WriteLine(order.ProductName);
Console.WriteLine(order.Total);
}
v1.0 功能
- 支持事务。现在生成两个重载,一个带有
SqlConnection
参数,另一个带有SqlTransaction
。 - 可以生成 C#、Visual Basic .NET 和 JScript .NET 代码。
- 支持
OUTPUT
参数。始终生成ref
参数(OUTPUT
参数可以是 in/out 和 out-only)。 - 现在,行类可以嵌套在命名空间中,也可以直接在命名空间中声明。这允许多个存储过程共享一个通用的行类型。它还允许将行类分解到不同的程序集中。
- 还为每个行类型生成了一个类型安全的集合类。
- 可以指定行类型和集合类型的名称。
- 命令行工具,允许将 SP/Invoke 集成到自动化生成过程中。
- 添加了文档,包括教程。
- 使用 XML 文件定义如何生成代码。可以为 XML 文件关联一个自定义生成工具。每当修改 XML 文件时,此生成工具都会自动执行。
v1.1 修复和功能
- 修复:money 和 smallmoney 类型现已正确支持。money 和 smallmoney 类型表示为 SqlMoney 而非 SqlDecimal。
- 修复:可变长度输出参数现已正确处理。
修复了 in/out 可变长度参数(即 varchar、nvarchar 和 varbinary)。
未指定参数的大小,导致结果被截断。现在生成代码,以根据存储过程的参数元数据指定参数缓冲区的大小。
- 文档:解释了使用 /codebase 开关安装自定义生成工具时出现的警告。
- 功能:检查器工具。
添加了检查器工具,该工具为数据库生成默认的 XML 输入文件。如果 SP/Invoke 要添加到包含数十甚至数百个存储过程的现有数据库的项目中,这将非常有用。在命令行输入objectnation.SPInvoke.Inspector
以获取工具参数说明。
- 功能:提供 XML Schema。使用 Schema 进行 XML 验证。
提供了一个 XML Schema,用于描述输入 XML Schema。SP/Invoke 生成器使用此 Schema 来验证输入,如果将以下命名空间引用添加到输入文件的根元素:xmlns="http://www.objectnation.com/Schemas/SPInvoke"
虽然验证非常有用(SP/Invoke 会生成验证错误,帮助您查找和修复 XML 中的拼写错误等),但它可能会导致现有 XML 文件出错。如果发生这种情况,只需省略上述的 xmlns 属性即可恢复到 v1.0 的 XML 解析行为。
- 功能:生成的代码的可访问性(可见性)可以从输入 XML 控制
<storedProcedureClass>
和<rowClass>
元素支持一个新属性:access。可用于控制生成类的访问/可见性。默认情况下,生成的可见性不是 public(即 C# 为 internal)。通过为 access 属性指定public
可以使类变为 public。
注意:此行为与始终生成 public 类型的 v1.0.1 不同。
v1.2 修复和功能
此维护版本增加了对 Microsoft Visual Studio .NET 2003 版的支持。此版本也支持 Visual Studio 2002 版。因此,v1.2 超越了 v1.1,适用于所有 Visual Studio .NET 用户。- 修复:在 Microsoft Visual Studio .NET 2003 Edition Final Beta 下编译时出现的编译错误
Microsoft 对 Microsoft Visual Studio .NET 2003 版的 IDE 扩展类进行了更改。因此,SP/Invoke 的先前版本(v1.1 及更早版本)在编译时会因以下编译错误而失败:
C:\Visual Studio Projects\SPInvoke\CustomBuild\CustomBuild.cs(243): 'Microsoft.VSDesigner.CodeGenerator.BaseCodeGeneratorWithSite' 由于其保护级别而无法访问
objectnation 已从 Microsoft 获取了 BaseCodeGeneratorWithSite 的替代实现。此代码已集成到 SP/Invoke v1.2 中。Custom Build 项目不再需要对 Microsoft.Designer 程序集的引用。
v2.0 修复和功能
- 修复:当服务器配置为混合模式时,未捕获 SQL Server 身份验证失败
CustomBuild 未能正确处理错误代码为 18452 的 SqlExceptions。此问题已修复。
感谢意大利 sercom Srl 的 Efran Cobisi 隔离了此问题。
- 修复:生成的 Invoke 方法中正确处理了 DataReader 的处置
当 IDbCommand.ExecuteReader 引发异常时,IDisposable.Dispose 未在所有实例中被调用。此问题已修复。
感谢意大利 sercom Srl 的 Efran Cobisi 隔离了此问题。
- 功能:增加了对用户定义数据类型的支持
v2.0 增加了对 SQL Server 用户定义数据类型的支持,这些类型会自动映射到其基类型。
- 功能:生成的代码中使用提供程序无关的 ADO.NET 类型
在 v2.0 之前,SP/Invoke 生成的代码会引用 System.Data.SqlClient 命名空间中的以下具体类SqlConnection, SqlCommand, SqlParameter, SqlTransaction.
现在不再使用这些类。而是使用以下提供程序无关的接口IDbConnection, IDbCommand, IDbDataParameter, IDbTransaction.
这使得在运行时使用 SP/Invoke 生成的代码可以使用 OleDb 或 Oracle 托管提供程序。但是,SP/Invoke 在设计时仍然只支持 SQL Server。
尽管如此,此功能允许开发人员在开发环境中使用 SQL Server,但也可以生成用于定位其他数据库服务器的代码(当然,前提是存储过程的原型/签名在数据库服务器之间是类型兼容的)。
- 功能:支持事件,包括每个存储过程和全局级别的事件
所有生成的存储过程类现在都包含一个名为 Events 的公共静态属性。此对象有三个公共事件PreExecute, PostExecute, Exception.
可以处理这些事件以添加集中的诊断跟踪、输入参数验证、SqlException 到持久化层异常映射等功能到您的应用程序。
此外,新的 StoredProcedures 类包含一个等效的 Events 属性。订阅这些事件会导致处理程序集中的所有生成的存储过程类的事件。
- 更改:所有 Invoke 重载现在都生成为 public 访问
SP/Invoke 为每个存储过程类生成三个重载的 Invoke 方法。在 v2.0 之前,其中两个重载被定义为 public,每个都委托给第三个私有实现。
通用的实现重载(接受 IDbConnection 和 IDbTransaction 参数)现在被声明为 public。
此改进由意大利 sercom Srl 的 Efran Cobisi 提出。
- 功能:添加了对 NDoc 兼容文档注释的支持
所有公共类、方法、事件和属性现在都使用文档注释进行记录,这些注释可以编译成帮助文件,用于 SP/Invoke 生成的编程接口的自动化文档。
SP/Invoke 生成的文档注释已使用 NDoc v1.1.1116 进行测试。
NDoc 是一个开源的 .NET 代码文档生成器,它远远优于 Microsoft 在 Visual Studio .NET 中包含的“Build Comment Web Pages...”工具。
有关 NDoc 的更多信息,请访问 http://ndoc.sourceforge.net/。
- 功能:生成的存储过程类标记为 StoredProcedureAttribute
在 v2.0 之前,无法轻松地使用反射隔离 SP/Invoke 生成的存储过程类。现在,所有存储过程类都标记为 StoredProcedureAttribute 类,该类还包含类封装的存储过程的名称。
v2.1 修复和功能
- 修复:CustomBuild 项目在发布版本中无法编译
此问题已修复。
- 修复:XSD schema 要求一个或多个 <server> 元素,从而阻止创建通用的仅类型 XML 文件
此问题已修复。XSD schema 已修改为允许不包含 <server> 或 <database> 元素的 XML 文件。
- 功能:增加了对调用存储过程后返回受影响行数的功能支持
每个生成的存储过程类都包含一个嵌套的 Result 类。此类的 Name 属性已添加,名为 RowsAffected。它包含存储过程中 INSERT、UPDATE 和 DELETE 语句受影响的行数。如果存储过程未执行其中任何语句,则此值将为 -1。
- 功能:RowsAffected 和 ReturnValue 可供 PostExecute 事件处理程序使用
PostExecuteEventArgs 类已扩展,包含 ReturnValue 和 RowsAffected 属性。
- 功能:可以通过单个属性控制所有类型的生成代码的访问/可见性
在 storedProcedures 元素中添加了一个新的 "access" 属性,允许从 XML 文件中的单个位置控制生成类型的可见性。
生成/编译信息
此版本的 SP/Invoke 以源代码形式提供。使用前需要 Visual Studio .NET 来生成程序集。注意:spinvoke_v2_1.pdf(在可下载的 .ZIP 文件中)包含编译源代码和安装二进制文件的详细说明。
链接
请查看 objectnation 的 downloads 页面以获取更新。请将反馈和建议发送至 feedback@objectnation.com