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

存储过程类生成器

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.63/5 (9投票s)

2004 年 11 月 19 日

3分钟阅读

viewsIcon

65932

downloadIcon

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。这在我们的应用程序中似乎运行良好,我们的应用程序主要使用 uniqueidentifiernvarchar[]int 作为参数。如果你的存储过程有其他类型的输入参数,你可能会遇到一些麻烦。

我在名为“@ref”的一些 SQL 参数上遇到了另一个问题。 我试图在 C# 和 SQL Server 中保持参数名称相同,但显然这对于关键字来说效果不佳。在这种情况下,我只是将所有 C# 参数从“ref”转换为“reff”。

就是这样。 我希望有人可能会觉得这有趣或有用。 我欢迎所有反馈,无论是正面的还是负面的。 我在真空中编码(现场唯一的开发人员)几年了,所以如果你认为某件事可以/应该/必须以不同的方式或更好的方式完成,请告诉我。

© . All rights reserved.