手工制作的强类型 ADO.net 数据表 - 它可以更干净吗?

2024-01-11

我最近遇到一个非常简单的类型化数据表(不使用 .XSD)(我丢失了作者的 URL,所以我不能相信他),但看起来有很多重复的代码(例如添加/删除/ GetNewRow 方法)。

我尝试将重复的方法推入超类中,但由于 Employee 需要通用,因此出现了问题。我希望 StackOverflow 的集体思维能提出一些想法来清理这个问题? (如果有可能的话?)

using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;

namespace TypedDataSet {

  public class Employees : DataTable {
    protected SqlDataAdapter _adapter;

    public Employees() {
      string connectionString = TypedDataSet.Properties.Settings.Default.ConnectionString;
      _adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT Id, Firstname, Surname FROM Employee", connectionString);
      _adapter.Fill(this);
    }

    public Employee this[int index] {
      get { return (Employee)Rows[index]; }
    }

    public void Add(Employee row) {
      Rows.Add(row);
    }

    public void Remove(Employee row) {
      Rows.Remove(row);
    }

    public Employee GetNewRow() {
      Employee row = (Employee)NewRow();
      return row;
    }

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
      return new Employee(builder);
    }

    public IEnumerator GetEnumerator() {
        return Rows.GetEnumerator();
    }

    protected override Type GetRowType() {
        return typeof(Employee);
    }
  }

  public class Employee : DataRow {
    internal Employee(DataRowBuilder builder)
      : base(builder) {
    }

    public Int64 Id {
      get { return (Int64)base["Id"]; }
      set { base["Id"] = value; }
    }

    public string FirstName {
      get { return (string)base["Firstname"]; }
      set { base["Firstname"] = value; }
    }

    public string Surname {
      get { return (string)base["Surname"]; }
      set { base["Surname"] = value; }
    }
  }
}

我相信我已经回答了我的问题。我必须使用 .net 4.0 才能获得我所希望的结果dynamic type.

因此,更改问题中的现有类:

员工.cs

using System;
using System.Data;
using System.Collections;
using System.Data.Common;

namespace TypedDataSet {

  public class Employees : BaseModel<Employee> {

    public Employees(bool loadAll) {
        DbDataAdapter adapter = base.Adapter("SELECT * FROM Employees");
        adapter.Fill(this);
    }

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
        return new Employee(builder);
    }
  }

  public class Employee : DataRow {
    internal Employee(DataRowBuilder builder)
      : base(builder) {
    }

    public Int64 Id {
      get { return (Int64)base["Id"]; }
      set { base["Id"] = value; }
    }

    public string FirstName {
      get { return (string)base["Firstname"]; }
      set { base["Firstname"] = value; }
    }

    public string Surname {
      get { return (string)base["Surname"]; }
      set { base["Surname"] = value; }
    }
  }
}

现在引入上面类继承的BaseModel


基础模型.cs

using System;
using System.Data;
using System.Collections;
using System.Data.Common;
using System.Data.SqlClient;

namespace TypedDataSet {

    public class BaseModel<T> : DataTable {
        protected DbDataAdapter _adapter;
        protected string _connectionString = TypedDataSet.Properties.Settings.Default.ConnectionString;

        public BaseModel() {
        }

        protected DbDataAdapter Adapter(string sql) {
            _adapter = new System.Data.SqlClient.SqlDataAdapter(sql, _connectionString);
            SqlCommandBuilder cb = new SqlCommandBuilder((SqlDataAdapter)_adapter);
            return _adapter; 
        }

        public dynamic this[int index] {
            get { return Rows[index]; }
        }

        public void Add(dynamic row) {
            Rows.Add(row);
        }

        public void Remove(dynamic row) {
            Rows.Remove(row);
        }

        public void Save() {
            _adapter.Update(this);
            this.AcceptChanges();
        }

        public dynamic GetNewRow() {
            dynamic row = (dynamic)NewRow();
            return row;
        }

        public IEnumerator GetEnumerator() {
            return Rows.GetEnumerator();
        }

        protected override Type GetRowType() {
            return typeof(T);
        }
    }
}

这允许我使用以下代码使用该类:


Employees employees = new Employees(true);

Employee employee = employees.GetNewRow();
employee.FirstName = "Greg";
employee.Surname = "Focker";
employees.Add(employee);

employees.Save();

foreach (Employee e in employees) {
  Console.WriteLine(e.FirstName + ' ' + e.Surname);
}

我希望能进一步发展这个项目,所以如果你对这个小项目感兴趣的话,未来的 StackOverflow 用户可以看看http://bitbucket.org/Mozketo/typeddataset/ http://bitbucket.org/Mozketo/typeddataset/我希望在其中托管代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手工制作的强类型 ADO.net 数据表 - 它可以更干净吗? 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • InstallReferrerClient.startConnection() 抛出错误

    我的一些用户在使用 InstallReferrerClient startConnection 时收到以下错误 我正在跟进android 开发者教程 https android developers googleblog com 2017
  • 如何使用实体框架仅更新一个字段?

    这是表格 Users UserId UserName Password EmailAddress 和代码 public void ChangePassword int userId string password code to updat
  • SQL Server 数据库字段处理韩文和中文字符

    SQL Server中是否有可能有一个字段可以存储中文 韩文和欧洲字符 我的汉字就变成了 数据类型是NVARCHAR以及 NVARCHAR是正确的类型 它将所有内容存储在 2 字节 Unicode 中 与您合作时需要注意的是NVARCHAR
  • Oracle SQL 语句动态模式变量

    我有数百行代码来创建表 但模式名称是硬编码的 如所有 DDL 语句中的 SCHEMA NAME1 TABLE NAME 我怎样才能将其作为变量并在所有地方使用 以便我们可以轻松地在一个地方更改 SCHEMA NAME 要求的多个位置 请给出
  • jquery 模式对话框 onclick?

    我要这个 http jqueryui com demos dialog modal message http jqueryui com demos dialog modal message 当您单击 ClickMe 时发生 这个怎么做 di
  • Firebase 数据库和应用本地化

    我正在为 iOS 和 Android 平台构建一个问答游戏 我希望能够处理本地化 我正在使用 Firebase 的实时数据库解决方案来解决游戏中存在的所有问题 我将问题硬编码到 Firebase 的数据库中 每个问题对象都有 2 个参数 I
  • 基于多个切片器值 Power BI 显示用户计数

    我正在研究一个Viewership table它告诉客户手表资产的数量 有两个资产过滤器 一种用于观看 另一种用于未观看 根据资产过滤器 我需要显示观看节目的客户数量和未观看节目的客户数量 下面是我用过的方法 首先 创建一个新表 Asset
  • 用 Fortran 编写矩阵

    我需要用 FORTRAN 输出一个矩阵 我有一个计算值的工作代码 但我得到的不是矩阵 而是一列 矩阵很大 ixj 2000x2000 这是我的示例代码 open 19 file results1 txt status old positio
  • firestore 是否已删除单个文档每秒写入 1 次的软限制?

    Firestore 始终对单个文档有每秒 1 次写入的软限制 这意味着 对于诸如每秒更新一次以上的计数器之类的事情 推荐的解决方案是分片计数器 看着Firestore 限制文档 https firebase google com docs
  • 使用 ASP.NET MVC 上传图像

    我需要上传图像作为 MVC 应用程序中创建操作的一部分 图像将存储在文件服务器中 数据库将包含该图像的路径 我计划使用以下标签来获取文件 gt
  • 如何将 2 个图像附加到布局底部

    我想附上2张图片 第一个位于左下角 其他位于右下角 但我希望这些图像在底部是核心的 这样如果我滚动页面 图像应该保留在同一位置 动态地 我成功地回答了我自己的问题 所以我特此为所有用户提供代码 它可以工作 所以拥有代码并享受 LinearL
  • Ionic 2 - Angular 2 http 标头未随请求一起发送

    我正在使用 Ionic 的最新测试版本 并且我已经为我的 api 服务器完成了 http post 方法 但标头不会随请求一起发送 我使用的代码如下 Ionic 版本 Beta 8 和 Angular 版本 rc 3 import Page
  • 将 UTF-8 字符串拆分为块

    我想将 UTF 8 字符串拆分为大小相等的块 我想出了一个解决方案 正是这样做的 现在我想简化它 如果可能的话 删除第一个收集调用 有办法做到吗 fn main let strings chars collect
  • Flask 中 return render_template 和 jinja 模板之间的区别

    我见过两种在 Flask 中路由 HTML 页面的方法 要么像这样声明一个名为 template 的变量 def home template jinja env get template hello form html return tem
  • 严格模式下不允许使用八进制文字

    我正在使用 Angular 2 当我在 SCSS 文件中使用它时 效果很好 text after content 00a0 00a0 然而 当我把它搬进去时 styles 表明 未捕获的语法错误 严格模式下不允许使用八进制文字 我知道代码s
  • 从数组 javascript 中删除元素(相反交集)

    昨天晚上我提出了这个问题从数组javascript中删除元素 https stackoverflow com questions 29711165 delete elements from array javascript但我错误地认为 我
  • 渲染与部分渲染和良率之间的差异

    我已经从 Rails 指南中读到了它 已经看过 Micheal Hartel 的书 现在又从 Rails View 的书中读到了它 但我仍然感到困惑 有一个 footer html erb文件 因此它是一个 部分 并且在它编写的代码中 所以
  • C 中指向二维数组的指针

    我知道有几个关于提供良好 和有效 解决方案的问题 但恕我直言 没有一个问题清楚地说明实现这一目标的最佳方法是什么 所以 假设我们有一些二维数组 int tab1 100 280 我们想要创建一个指向这个二维数组的指针 为了实现这一目标 我们
  • iOS - 将 NSDictionary 写入 Localized.strings

    这个问题是那个问题的连续体 iOS 我可以在运行时更改 localized strings 内容吗 https stackoverflow com questions 13625008 ios could i change the loca
  • 手工制作的强类型 ADO.net 数据表 - 它可以更干净吗?

    我最近遇到一个非常简单的类型化数据表 不使用 XSD 我丢失了作者的 URL 所以我不能相信他 但看起来有很多重复的代码 例如添加 删除 GetNewRow 方法 我尝试将重复的方法推入超类中 但由于 Employee 需要通用 因此出现了