c# - 如果数据库中的列发生变化,有没有办法不破坏代码?

标签 c#

假设我声明了一个数据表,并且我已经为这个数据表分配了一个从调用存储过程返回的结果,所以现在,我的数据表在访问其中的一行时包含如下内容:

string name = dr["firstname"];
int age = (int)dr["age"];

如果将 firstname 更改为 first_name 并删除 age,代码显然会中断,因为现在模式已中断,那么有没有一种方法可以始终自动使模式与代码保持同步,而无需手动执行?是否有某种元描述文件描述数据库表中的列并相应地更新它们?在这种情况下,LINQ 是否可以因其强类型性质而有所帮助?

最佳答案

  1. 按列名选择的老式 View 怎么样,它们总是以指定顺序输出具有指定名称的列。如果下面的表需要更改,则 View 会在必要时进行修改,但仍会输出与基础表更改之前相同的输出——就像对象的接口(interface)一样。应用程序引用 View 而不是表并继续正常工作。这归结为标准的数据库应用程序设计,应该在任何(甚至是基础的)数据架构师类(class)中教授——但我很少看到这些在业务应用程序中实际使用。事实上,我目前正在从事的项目是我第一次看到采用这种方法的项目,实际看到它被正确使用令人耳目一新。

  2. 使用存储过程,如果您的表发生变化,请修改存储过程以使输出仍然相同 - 以类似的方式使用以将应用程序与基础表隔离开来,从而使应用程序免受任何表更改的影响。如果您希望在 View 更合适的地方执行动态联接、筛选和聚合,这还不够。

  3. 如果您想在应用程序端执行此操作,请直接在查询中指定要查询的字段名称,而不是使用“select *”并依赖字段名称的存在。但是,如果表中的字段名称发生变化,或者列被删除,您仍然卡住了,您必须修改查询。

  4. 如果字段的名称​​将改变,但所有字段将始终存在,这些字段的内容将保持不变并且字段将保持相同的顺序,您可以按索引而不是按名称引用字段。

  5. 使用其他人指定的对象关系映射器,但我认为这不一定会教出良好的设计,而不是希望框架的设计足够好并且适合您正在做的事情,这可能或可能并非如此。不过,我并不是真的认为这是一个好方法。

关于c# - 如果数据库中的列发生变化,有没有办法不破坏代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929205/

相关文章:

c# - 连接一个二维数组

c# - 如何在用户打开文件时锁定对文件的访问?

C# 捕获直接 3D 屏幕

c# - 比较 Entity Framework 内的 2 个列表 Where 子句

c# - 错误 - 使用 sdkToolsPath 找不到 al.exe

c# - MonoGame安装的程序集与MonoGame.Binaries NuGet软件包中的程序集有何不同?

c# - 在 C# 中, '|=' 是做什么的?

c# - Threading.Tasks.Task' 不包含 'Result' 的定义

c# - 释放 COM 对象

c# - 在 IIS 中,System.Random.NextBytes 占用大量 CPU