C# 从SQL表读取自定义数据

C# 从SQL表读取自定义数据,c#,sql,datamapper,C#,Sql,Datamapper,我们有一个应用程序,允许用户向表中添加自定义列(也许不是最好的主意,但事实就是这样) 我们现在正在(重新)设计我们的dataaccess层(我们以前没有),现在我们将在查询SQL数据库时在DataMapper中使用参数化查询(前面我们连接了SQL字符串并转义了所有输入) 现在,我们试图确定处理自定义列的最佳方式,以便查询、创建和更新这些记录。自定义属性将存储在“业务对象”的字典中,因此我考虑这样做: 查询数据 使用SELECT*获取所有列,填充我们的属性,并将其余(自定义数据)存储在业务对象的

我们有一个应用程序,允许用户向表中添加自定义列(也许不是最好的主意,但事实就是这样)

我们现在正在(重新)设计我们的dataaccess层(我们以前没有),现在我们将在查询SQL数据库时在DataMapper中使用参数化查询(前面我们连接了SQL字符串并转义了所有输入)

现在,我们试图确定处理自定义列的最佳方式,以便查询、创建和更新这些记录。自定义属性将存储在“业务对象”的字典中,因此我考虑这样做:

查询数据

  • 使用SELECT*获取所有列,填充我们的属性,并将其余(自定义数据)存储在业务对象的字典中
创建/更新

  • 迭代表中的所有列(类似于:从information_schema.columns中选择COLUMN_NAME,其中table_NAME='TableName'
  • 通过检查字典和表中都存在哪些列,然后将字典中的值作为变量添加到SQLCommand,生成SQL字符串(带有参数化的variablenames)

或者,在仍然使用参数化查询的情况下,有没有更好的方法?

如果您要添加特殊列,ORM会变得非常棘手。在某些方面,返回到
DataTable
/
DataAdapter
(我不喜欢)可能是一个选项。就个人而言,我首先会看看存储自定义数据的其他选项:

  • xml
  • 针对每条记录的一组键/值对(在第二个表中)
  • [n]varchar(max)

你真的需要添加列吗?

更好的方法,比如使用像NHibernate这样的ORM?是的,我也在考虑这个问题。NHibernate可以处理在编译时不存在的自定义数据吗?是否容易为“最终用户”定制除了在SQL Management Studio中添加列之外,无需其他任何操作?Re ORM:那么,问题是大多数ORM都希望写入成员。这可能意味着在运行时写入类型(
TypeBuilder
)-相当复杂+困难。不太好。如果我们今天构建应用程序,另一个表中的键/值可能是我们应该设计它的方式,但出于遗留原因,我们可能或多或少被迫使用添加列方法。