c# - 设计类以应对频繁的数据库模式更改

标签 c# class-design

我正在处理由另一个系统维护的数据库,因此我无法对表进行任何重大更改。该数据库中的表有相当多的字段(超过 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/

相关文章:

C# 将类实例的创建限制在命名空间内

c++ - C++ 中有没有办法将给定类的函数限制为仅另一个类(不使用继承, friend )?

ios - 来自 Performance Wise : Class Computed Property vs Stored Property

c++ - 驻留在另一个类中的父类类型的成员

c# - 在调整大小时调整 silverlight Canvas 中所有元素的最佳方法是什么?

c# - ASP.NET:如何使用 aspnet_regsql.exe 创建登录系统?

c# - 在 Azure SQL 上保存 Datetimeoffset 不起作用

c# - 如何在 xml 文档中引用泛型类和方法

c# - 获取错误 : NullReferenceException was not handled

java - builder 模式会不会做得太多?