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

agStoredProc

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (10投票s)

2004 年 11 月 19 日

2分钟阅读

viewsIcon

68375

downloadIcon

1131

使用 agStoredProc,您可以从 MS-SQL 数据库中的所有存储过程生成一个 C# 类。无需 Microsoft ApplicationBlocks。

引言

在开发使用存储过程的应用程序时,我厌倦了每次都重复相同的过程:存储过程名称、参数、参数类型、参数方向……天啊,真的,这太令人厌烦了。所以有一次,我决定不再这样做。这就是我开发这个小应用程序并决定与您分享的原因。

我开发它的时间,2004 年 5 月,我还不了解 Microsoft Application Blocks,所以不得不硬编码,这么说吧。如果我之前知道 MS App Blocks,我就会用它来做,但已经完成了,而且运行速度还算快:五秒钟内处理大约 40,000 行代码。一位朋友告诉我,我可以使用 CodeDom 命名空间来做到这一点,但说实话,我只使用了 SqlClient 类和一个可怜的 StringBuilder,所以只是纯粹的字符串拼接。

这是运行应用程序的截图

Sample image

这是我用来获取每个存储过程的参数的一小段代码

foreach (string str in commands)
{
  SqlCommand myCommand = new SqlCommand("SELECT * " + 
             "FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME = '" 
             + str + "'", mycon);
  SqlDataReader myReader = myCommand.ExecuteReader();
  if (myReader.HasRows)
  {
    string prms = "";
    SqlCommand cmdParams = new SqlCommand("SELECT DATA_TYPE," + 
               " PARAMETER_NAME FROM INFORMATION_SCHEMA.PARAMETERS" + 
               " WHERE SPECIFIC_NAME = '"+str+"'", mycon2);
    SqlDataReader ParamsReader = cmdParams.ExecuteReader();
    int prm = 0;
    if (ParamsReader.HasRows)
    {
      while(ParamsReader.Read())
      {
        string prmname = ParamsReader.GetString(0);
        prms += ParamTypeToString(prmname) + " _" + 
                ParamsReader.GetString(1).Remove(0,1).ToLower() 
                +", ";
        prm++;
      }
    }
    prms = prms.Remove(prms.Length -1, 1);
    strBuilder.Append("\n\n\tpublic void " + commands[i] + "(" + 
                      prms.Remove(prms.Length -1, 1)+")");
    strBuilder.Append("\n\t{");
    string sqlcon = (this.tbConnection.Text == "")? "\"" + 
                     this.connection+"\"" : this.tbConnection.Text;
    strBuilder.Append("\n\t\tSqlConnection sqlCon = 
                                  new SqlConnection("+sqlcon+");");
    strBuilder.Append("\n\t\tSqlCommand myCommand = 
                    new SqlCommand(\""+commands[i]+"\", sqlCon);");
    strBuilder.Append("\n\t\tmyCommand.CommandType = 
                                    CommandType.StoredProcedure;");
    while(myReader.Read())
    {
      string _size = (myReader.IsDBNull(9)) ? "": ", " + 
                        myReader.GetInt32(9).ToString();
      string param_name_whole = myReader.GetString(7);
      string param_name = param_name_whole.Remove(0,1);

如您所见,这只是我针对 SQL Server 运行的一些命令。我以前不知道这些命令,但通过帮助文档,我找到了它们,并且它们真的有效。

摘要

诚实地说,有更好的方法来做到这一点,但这是我找到的第一种方法。当时我不知道 Application Blocks,而且在完成应用程序后,我真的不想更改代码,因为它确实有效,并且对于它的用途来说,它相当不错。它会多次访问 SQL Server 以查找存储过程,然后是参数等,但我认为它运行速度很快。

我希望您能找到它的用处。希望您喜欢它。

© . All rights reserved.