存储过程类生成器






1.63/5 (9投票s)
2004 年 11 月 19 日
3分钟阅读

65932

899
生成代码类,通过 Web 服务访问存储过程。
引言
这是一个小型项目,用于生成通过 Web 服务访问存储过程的类,它源于对 SQLXML 3.0 的不满。
使用代码
这是一个非常基础(而且有点粗糙)的代码类,它查找 SQL Server 数据库中的所有存储过程,并生成一个 C# 类来访问它们。之所以出现这个,是因为我正在寻找一种快速的方法,通过我正在处理的 Web 服务层公开几个存储过程。 在花了两天时间摆弄 SQLXML 3.0 之后,最终对结果感到有点失望,所以代码生成器似乎是个好主意。所以这就是它。代码一点也不花哨。只是获取存储过程的列表,并使用大量字符串生成器来生成代码类。我确实查看了 Code Project 和其他地方的一些基于模板的生成器(类似于 Raptier),但最终,没有太多时间去完成它们。
生成两种类型的类,具体取决于“webMethod
”属性的设置。如果设置为 true
,则会包含一些额外的内容,以通过 Web 服务公开这些方法。如果选择此选项,则只生成代码类。你仍然需要将其链接到 .asmx 页面。
它还会生成一个 app.config 文件,其中包含一个包含所有过程名称的部分,以及一个布尔值,用于指示该过程是否应通过 C# 代码访问。它默认为“false
”,这意味着该过程受到限制。只需将其更改为“true
”即可公开你想要的过程。 这样做的目的是将该部分从生成的文件复制到你“真实的” .config 文件中,尽管它似乎运行良好,就像它一样。
在运行代码之前,你将需要在 generateProcCode.cs 的第 17 行设置连接字符串,使其有用。
private string m_sconn =
"Persist Security Info=False;Integrated Security=false;" +
"user id=[lebowski];password=[thedude];database=arkis2db;" +
"server=[ipaddress];encrypt=false\";
我已经包含了一个小型测试项目,它可以帮助你了解其余部分。基本上,只需实例化该类,设置 webMethod
属性,并使用输出路径作为唯一参数调用 genClass
方法。生成存储过程类后,你将需要更改命名空间并为你的项目设置连接字符串。
这是输出的一个示例
///<summary>
///summary description for p_generateLoanID
///</summary>
public DataSet p_generateLoanID(
out int RETURN_VALUE,
int type,
string aukt,
ref int NewID){
if(false == procRunStatus("p_generateLoanID"))
throw new Exception("Stored procedure p_generateLoanID not enabled");
using(SqlConnection oconn = new SqlConnection(m_sconn)){
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand("p_generateLoanID",oconn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter prm_RETURN_VALUE =
cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int);
SqlParameter prm_type = cmd.Parameters.Add("@type", type);
SqlParameter prm_aukt = cmd.Parameters.Add("@aukt", aukt);
SqlParameter prm_NewID = cmd.Parameters.Add("@NewID", NewID);
prm_RETURN_VALUE.Direction = ParameterDirection.ReturnValue;
prm_NewID.Direction = ParameterDirection.Output;
oconn.Open();
da.Fill(ds);
RETURN_VALUE =
cmd.Parameters["@RETURN_VALUE"].Value == DBNull.Value ? -12345 :
(int)cmd.Parameters["@RETURN_VALUE"].Value;
NewID = cmd.Parameters["@NewID"].Value == DBNull.Value ? -1 :
(int)cmd.Parameters["@NewID"].Value;
return ds;
}
}
关注点
在 SQL 和 C# 之间处理类型转换的方法可能会出现一些问题。我选择大多数时候只使用 string
/int
。这在我们的应用程序中似乎运行良好,我们的应用程序主要使用 uniqueidentifier
、nvarchar[]
和 int
作为参数。如果你的存储过程有其他类型的输入参数,你可能会遇到一些麻烦。
我在名为“@ref
”的一些 SQL 参数上遇到了另一个问题。 我试图在 C# 和 SQL Server 中保持参数名称相同,但显然这对于关键字来说效果不佳。在这种情况下,我只是将所有 C# 参数从“ref”转换为“reff”。
就是这样。 我希望有人可能会觉得这有趣或有用。 我欢迎所有反馈,无论是正面的还是负面的。 我在真空中编码(现场唯一的开发人员)几年了,所以如果你认为某件事可以/应该/必须以不同的方式或更好的方式完成,请告诉我。