我正在处理由另一个系统维护的数据库,因此我无法对表进行任何重大更改。该数据库中的表有相当多的字段(超过 30 个),没有两个表具有相同的命名约定、类型或相同数量的字段。这些表也经常更改(添加、删除字段或更改它们的类型),更糟糕的是,还经常创建新表。现在我有一个可以严格类型化的表,用作队列。
问题:
我必须从给定表名和该表中的某些列的表中获取数据。列名以字符串形式提供。由于这些表经常更改,因此很难为每个表维护严格类型化的实体。
我该如何设计我的类,使它们松散耦合但允许我使用这些表?
感谢您的帮助,如果我的解释很糟糕,我们深表歉意。
最佳答案
一个想法是使用 SQL Management Objects (SMO)与 Tables动态创建强类型。
Server srv = new Server(conn);
Database db = srv.Databases["AdventureWorks"];
foreach (Table table in db.Tables)
{
Console.WriteLine(" " + table.Name);
foreach (Column col in table.Columns)
{
Console.WriteLine(" " + col.Name + " " + col.DataType.Name);
}
}
我已经用这种方式为数据访问层编写了单元测试生成器,您可以使用 DataTypes 列来组成类,例如(在线查找更好的实现 - 在 C# 中):
Public Function SQLParameterType(ByVal ParameterDataType As String) As String
ParameterDataType = ParameterDataType.ToUpper
If ParameterDataType.IndexOf("NVARCHAR") > 0 Then
Return "string"
ElseIf ParameterDataType.IndexOf("VARCHAR") > 0 Then
Return "string"
End If
Select Case ParameterDataType
Case Is = "BIGINT"
Return "Int64"
Case Is = "INT"
Return "Int32"
Case Is = "SMALLINT"
Return "Int16"
Case Is = "BIT"
If gIsVBdotNet Then
Return "boolean"
Else
Return "bool"
End If
Case Is = "DATETIME"
Return "DateTime"
Case Is = "DATETIME2"
Return "DateTime"
Case Is = "SMALLDATETIME"
Return "DateTime"
Case Is = "MONEY"
Return "single" 'float
Case Is = "FLOAT"
Return "single" 'float
Case Is = "REAL"
Return "double"
'Case Is = "INT"
' Return "int32"
'Case Is = "INT"
' Return "int32"
Case Else
Return "666"
End Select
End Function
使用这个以模式中立的方式连接到数据库的简单 ORM,您可以将动态生成的类松散地耦合到 dB。新Dynamic .Net 4 中的类型似乎是此应用程序的良好多态数据类型候选者。
关于c# - 设计类以应对频繁的数据库模式更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372715/