【问题标题】:Is there a way to override code generator for DataSet?有没有办法覆盖 DataSet 的代码生成器?
【发布时间】:2011-07-07 21:06:39
【问题描述】:

我正在使用带有 Oracle 数据提供程序 (Oracel.DataAccess.dll) 的 DataSet(请不要问为什么),我不喜欢生成的代码。

有没有办法覆盖 DataSet 的代码生成器?如果我使用不同的数据提供者怎么办?

【问题讨论】:

    标签: c# oracle visual-studio-2010 code-generation


    【解决方案1】:

    仅仅因为您使用 DataSets 并不意味着代码生成。那么,您究竟在使用/做什么来生成代码?

    dataProvider 也不意味着生成了代码。您可以直接访问数据并自己使用数据填充数据集。

    例如

    #region GetPostsFeatured
    
    internal DbDataReader GetPostsFeatured()
    {
      using (var command = CreateCommandForGetPostsFeatured())
      {
        DbConnection.Open();
        return command.ExecuteReader(CommandBehavior.CloseConnection);
      }
    }
    
    internal DataSet GetPostsFeaturedDataSet()
    {
      var adapter = DbProviderFactory.CreateDataAdapter();
      adapter.SelectCommand = CreateCommandForGetPostsFeatured();
      var ds = new DataSet();
      adapter.Fill(ds);
      return ds;
    }
    
    private DbCommand CreateCommandForGetPostsFeatured()
    {
      var command = DbConnection.CreateCommand();
      command.CommandType = CommandType.StoredProcedure;
      command.CommandText = "GetPostsFeatured";
      var parameter = DbProviderFactory.CreateParameter();
      parameter.DbType = DbType.Int32;
      parameter.Direction = ParameterDirection.ReturnValue;
      parameter.ParameterName = "@RETURN";
      command.Parameters.Add(parameter);
      return command;
    }
    
    #endregion GetPostsFeatured
    

    上面的代码使用 ADO.NET 核心(我认为您也在使用)。注意有两种方法

    1. GetPostsFeatured() - 返回一个 DbDataReader
    2. GetPostsFeaturedDataSet() - 其中 返回一个数据集

    注意 DataSet 是如何被数据库中的数据填充的?

    在这种情况下,我使用的是 MS SQL 数据提供者,但它可以是任何数据提供者。它们都支持一组通用的功能。

    使用配置文件的连接字符串部分并实例化连接等的代码如下所示

      internal partial class DataModule
      {
        private DbProviderFactory DbProviderFactory { get; set; }
        private DbConnection DbConnection { get; set; }
    
        public DataModule()
        {
          var connectionStringSettings = ConfigurationManager.ConnectionStrings["Orion"];
          DbProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
          DbConnection = DbProviderFactory.CreateConnection();
          DbConnection.ConnectionString = connectionStringSettings.ConnectionString;
        }
      }
    

    在我的博客上,有一篇关于我编写的直接从存储过程生成代码的工具的文章(我在这里向您展示的所有代码都是生成的代码)。该工具的源代码也是可用的,因此您可以修改生成的代码以及您想要的任何其他内容。 Data Access Layer CodeGen

    【讨论】:

      【解决方案2】:

      你可以编写partial类并添加你自己喜欢的函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 2019-01-29
        • 2015-03-22
        • 2012-11-01
        • 1970-01-01
        • 2010-09-07
        • 2021-04-13
        相关资源
        最近更新 更多