C#根据实体类特性动态构造SQL 语句

 一、原理与环境

在生成数据表的实体类时,利用自定义特性,给它打上表及字段的特性,然后使用反射原理,将自定义特性拼接成增、删、改、查对应的SQL,即可完成一个简单的ORM。

    本示例的执行环境:

    1)数据库:SQL Server。(可根据自己的需要,建立不同的数据库工厂。)

    2)数据表:需使用自增类型(identity)作为数据表的主键。主键名字可以随便起,如ID。

    3)实体类:实体类需提供无参构造函数。

二、演示数据表

CREATE TABLE [dbo].[Person](
    [ID] [BIGINT] IDENTITY(1,1) NOT NULL,
    [Name] [NVARCHAR](50) NULL,
    [Age] [INT] NULL,
    [Gender] [NVARCHAR](10) NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

   二、自定义特性

    定义两个自定义特性:

(二)关于特性

什么是 Attribute?

它是对运行时的对象或对象的属性、方法、委托等进行描述的类。
Attribute 的作用?
用于在运行时,描述你的代码或者影响你的程序的行为。

注意:

既然Attribute 是类,那么它的定义与定义类一样。
唯一不同的就是,自定义Attribute 类必须继承于System.Attribute 空间。
特性的示例:

//描述数据库字段的 Attribute
public class DataFieldAttribute : Attribute
{
    public DataFieldAttribute(string fieldName, string fieldType)
    {
        this._fieldName = fieldName;
        this._fieldType = fieldType;
    }
    // 数据库字段名
    private string _fieldName;
    public string FieldName
    {
        get { return _fieldName; }
        set { _fieldName = value; }
    }
    // 数据库字段类型
    private string _fieldType;
    public string FieldType
    {
        get { return _fieldType; }
        set { _fieldType = value; }
    }
}

通过自定义Attribute,我们定义了类属性和数据库字段的一一对应关系,于是对MyStudent 类的Name、Age 属性都加上Attribute 的描述,指定他们对应的数据库字段名以及类型。
代码更改如下:

public class MyStudent
{
    private string _name;
    //使用“特性”描述对应的数据库字段名、类型
    [DataFieldAttribute("SName", "varchar")]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    private int _age;
    [DataFieldAttribute("SAge", "int")]
    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
}

(三)ORM 映射规则的定义

给实体类增加DataFieldAttribute 的描述,其实就是增加了O(对象)/ R(关系数据库)的映射规则。
下面我们就通过反射的方法实现:在运行时动态获取O/R  Mapping 的映射规则:

        static void Main(string[] args)
        {
            MyStudent stu1 = new MyStudent();
            stu1.Name = "章子怡";
            stu1.Age = 40;
            //通过反射的方法来动态获取此映射规则
            PropertyInfo[] infos = stu1.GetType().GetProperties();
            object[] objs_fieldAttr = null;
            foreach (PropertyInfo info in infos)
            {
                // GetCustomAttributes: 
                // 返回实体对象中每个属性对应的“特性”信息(数据库字段名、类型)
                objs_fieldAttr = info.GetCustomAttributes(typeof(DataFieldAttribute), false);
                if (objs_fieldAttr != null)
                {
                    Console.Write("实体类的属性名:" + info.Name);
                    Console.Write(" -> 数据库字段名:");
                    Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[0]).FieldName);
                }
            }

        }

显示结果:


 
接下来的工作就是:怎样根据这种方法动态地从对象中获取映射规则,然后动态构造Insert、Update、Delete 等 SQL 语句。这就是实现自己的ORM 的原理。

这里的代码仅仅是举例,而要真正实现一个ORM,我们还需要考虑的很多,比如:

1、实体类对应于哪张数据库表?
2、数据库表中的 PK  和 FK(如果有的话)怎么表示?

C#根据反射和特性实现ORM映射实例分析_C#教程_脚本之家

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,可以通过下列步骤将的结构生成C代码: 1. 打开SQL Server Management Studio(SSMS),连接到相应的数据库。 2. 在数据库中选中要生成C代码的。 3. 右键点击该,选择“脚本” -> “生成” -> “创建到” -> “文件”。 4. 在弹出的对话框中,选择要保存C代码的文件路径和文件名,点击“下一步”。 5. 在下一个对话框中,选择要生成的对象类型。对于生成的C代码,选择“”即可。可以选择性地勾选“生成带有外键的”选项。 6. 点击“完成”开始生成C代码。 7. 打开生成的C代码文件,即可查看的结构。 C代码的示例(仅含有的结构)如下: ```c #include <stdio.h> typedef struct { int id; char name[50]; double price; } Product; typedef struct { int id; int productId; int quantity; } Order; typedef struct { int id; char name[50]; char email[50]; } Customer; int main() { // Table: Product printf("Table: Product\n"); printf("id INT\n"); printf("name VARCHAR(50)\n"); printf("price FLOAT\n\n"); // Table: Order printf("Table: Order\n"); printf("id INT\n"); printf("productId INT\n"); printf("quantity INT\n\n"); // Table: Customer printf("Table: Customer\n"); printf("id INT\n"); printf("name VARCHAR(50)\n"); printf("email VARCHAR(50)\n"); return 0; } ``` 以上示例中,通过C结构体示每个的结构,通过printf语句输出结构信息。你可以根据实际需求进行调整和扩展。 这样,你就可以将SQL Server中的结构以C代码的形式生成和使用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值