个人试做了C#关于以面向对象的方式操作数据库的插件 希望多给点建议................

博主分享了自己使用C#实现的一个面向对象的SQL处理插件,通过创建数据库表对应的实体类和映射类,实现了查找、插入、更新和删除等基本数据库操作。文章以一个简单的数据库结构为例,展示了如何通过接口和继承来处理数据库的外键关系,并提供了插件的部分代码示例。
摘要由CSDN通过智能技术生成

本来是学习java的,最近开始学习了C#.因为对java的hibernate颇有了解,所以就利用C#写了这个面向对象的SQL处理插件。

具体是这样是用的:

首先建立一个数据库DataBaseTest(此数据库只是用来测试)

表1 Test1

Id int 主键 自增长

Name varchar(50) 非空

TId 外键 引用 Test2 的 Id

表2 Test2

Id int 主键 自增长

Value varchar(50)非空

TId 外键 引用 Test3 的 Id

表3 Test3

Id int 主键 自增长

Test varchar(50)

 

首先先写好3个实体类:

//Test1

using System;

namespace DataBaseTest

{

    public interface ITest1

    {

        int Id { get; set; }

        string Name { get; set; }

        ITest2 TId { get; set; }

    }

}

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataBaseTest

{

    [Serializable]

    public class Test1 : DataBaseTest.ITest1

    {

        private Int32 _id;

 

        public Int32 Id

        {

            get { return _id; }

            set { _id = value; }

        }

        private String _name;

 

        public String Name

        {

            get { return _name; }

            set { _name = value; }

        }

        private ITest2 _tId;

 

        public ITest2 TId

        {

            get { return _tId; }

            set { _tId = value; }

        }

    }

}

 

//Test2

using System;

namespace DataBaseTest

{

    public interface ITest2

    {

        int Id { get; set; }

        ITest3 TId { get; set; }

        string Value { get; set; }

    }

}

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataBaseTest

{

    [Serializable]

    public class Test2 : DataBaseTest.ITest2

    {

        private Int32 _id;

 

        public Int32 Id

        {

            get { return _id; }

            set { _id = value; }

        }

        private String _value;

 

        public String Value

        {

            get { return _value; }

            set { _value = value; }

        }

        private ITest3 _tId = new Test3();

 

        public ITest3 TId

        {

            get { return _tId; }

            set { _tId = value; }

        }

    }

}

//Test3

using System;

namespace DataBaseTest

{

    public interface ITest3

    {

        int Id { get; set; }

        string Test { get; set; }

    }

}

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DataBaseTest

{

    [Serializable]

    public class Test3 : DataBaseTest.ITest3

    {

        private Int32 _id;

 

        public Int32 Id

        {

            get { return _id; }

            set { _id = value; }

        }

        private String _test;

 

        public String Test

        {

            get { return _test; }

            set { _test = value; }

        }

    }

}

 

 

接下来要写一个Mapping 名字可以随意 但是必须继承Org.Shouchan.Hibernate.Data.AbsMapping 或者实现 Org.Shouchan.Hibernate.Data.IMapping

//Mapping

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Org.Shouchan.Hibernate.Data;

 

namespace DataBaseTest

{

    public class Mapping : AbsMapping

    {

        private static IColumn _test1 = new Column(new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),

                                                   new Param<String>(EKey.PARAM, "Name", System.Data.SqlDbType.VarChar, 50, true, null),

                                                   new Param<ITest2, Test2>(EKey.OUT_KEY, "TId", System.Data.SqlDbType.Int, 0, true, "Id"));

 

        public static IColumn Test1

        {

            get { return Mapping._test1; }

            set { Mapping._test1 = value; }

        }

        private static IColumn _test2 = new Column(new IOutKey[]{new OutKey<ITest1,Test1>()},

                                                   new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),

                                                   new Param<String>(EKey.PARAM, "Value", System.Data.SqlDbType.VarChar, 50, true, null),

                                                   new Param<ITest3, Test3>(EKey.OUT_KEY, "TId", System.Data.SqlDbType.Int, 0, true, "Id"));

 

        public static IColumn Test2

        {

            get { return Mapping._test2; }

            set { Mapping._test2 = value; }

        }

        private static IColumn _test3 = new Column(new IOutKey[] { new OutKey<ITest2, Test2>() },

                                                   new Param<Int32>(EKey.MASTER_ATO_KEY, "Id", System.Data.SqlDbType.Int, 0, true, null),

                                                   new Param<String>(EKey.PARAM, "Test", System.Data.SqlDbType.VarChar, 50, false, null));

 

        public static IColumn Test3

        {

            get { return Mapping._test3; }

            set { Mapping._test3 = value; }

        }

    }

}

//:Mapping类必须有static Icolumn类型 并且与前面实体类同名的属性

 

现在准备工作就都已经完成了 接下来就可以做测试了

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.SqlClient;

using Org.Shouchan.Hibernate.Data;

 

namespace DataBaseTest

{

    class Program

    {

        static void Main(string[] args)

        {

            SqlConnection connection = new SqlConnection();

            connection.ConnectionString = @"Data Source=SHOUCHAN-PC/VAIO_VEDB;Initial Catalog=DataBaseTest;Integrated Security=True";

            //查找

            ISelect<Mapping, ITest1> seT1 = new Select<Mapping, ITest1, Test1>(connection);

            ISelect<Mapping, ITest2> seT2 = new Select<Mapping, ITest2, Test2>(connection);

            ISelect<Mapping, ITest3> seT3 = new Select<Mapping, ITest3, Test3>(connection);

            //seT1.AtoCheck = [Boolean] 设置 是否自动检查错误,自动检查错误时如果发现存在错误就会自动停止执行查找操作!

            //seT1.AtoConnectionClose = [Boolean] 设置是否自动关闭connection

            //seT1.Columns = [string[]] 设置要查找的列,不设置为 * ,推荐使用seT1.SetColumns(param string) 方法!

            //seT1.ConvertParams = [IConvertParam[]] 设置CONVERT可以对列进行强转,在操作日期类型的列时,很常用,推荐使用seT1.SetConvertParam(param ConvertParam) 方法!

            //seT1.DispNull = [Boolean] 设置为空时是以null返回 还是返回一个实例华的实体类

            //seT1.OrderBies = [IOrderBy[]] 设置排序,推荐使用seT1.SetOrderBy(param IOrderBy) 方法!

            //seT1.GetAllValue = [Boolean] 设置是否把外键的表全部调取出来!

            //seT1.PageSize = [long] 设置查找多少

            //seT1.Page = [IPage] 与seT1.PageSize结合使用 实现分页!

            //seT1.SelectParams = [ISelectParam[]] 设置查询的条件,推荐使用seT1.SetSelectParam(param SelectParam) 方法!

            seT1.SetSelectParams(new SelectParam(Mapping.Test1["Id"],ETerms.EQ,1));

            ITest1 t1 = seT1.GetValue();

            System.Console.WriteLine("Test1:" + t1.Id + "/t" + t1.Name + "/n外键TId:(Test2)" + t1.TId.Id + "/t" + t1.TId.Value + "/n外键TId:(Test3)" + t1.TId.TId.Id + "/t" + t1.TId.TId.Test);

            System.Console.WriteLine("SQL:/n" + seT1.Sql);

 

            //插入           

            IInsert<Mapping, ITest1> inT1 = new Insert<Mapping, ITest1, Test1>(connection);

            IInsert<Mapping, ITest2> inT2 = new Insert<Mapping, ITest2, Test2>(connection);

            IInsert<Mapping, ITest3> inT3 = new Insert<Mapping, ITest3, Test3>(connection);

            ITest3 t3 = new Test3();

            t3.Test = "test2";

            inT3.Entity = t3;

            inT3.Add();

            Console.WriteLine("执行插入t3SQL语句");

            Console.WriteLine(inT3.Sql);

 

            ITest2 t2 = new Test2();

            t2.Value = "Value2";

            seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],2));

            t2.TId = seT3.GetValue();

            inT2.Entity = t2;

            inT2.Add();

            Console.WriteLine("执行插入t2SQL语句");

            Console.WriteLine(inT2.Sql);

 

            t1 = new Test1();

            t1.Name = "Name2";

            seT2.SetSelectParams(new SelectParam(Mapping.Test2["Id"], 2));

            t1.TId = seT2.GetValue();

            inT1.Entity = t1;

            inT1.Add();

            Console.WriteLine("执行插入t1SQL语句");

            Console.WriteLine(inT1.Sql);

 

            //察看数据库是否有更新

            IList<ITest1> liT1 = seT1.GetValues();

            foreach (ITest1 tii in liT1)

            {

                System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");

            }

 

            //更新

            IUpdate<Mapping, ITest1> upT1 = new Update<Mapping, ITest1, Test1>(connection);

            IUpdate<Mapping, ITest2> upT2 = new Update<Mapping, ITest2, Test2>(connection);

            IUpdate<Mapping, ITest3> upT3 = new Update<Mapping, ITest3, Test3>(connection);

            seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],1));

            t3 = seT3.GetValue();

            t3.Test = "UpdateTest";

            upT3.Entity = t3;

            upT3.Upd();

            Console.WriteLine("执行更新t3SQL语句");

            Console.WriteLine(upT3.Sql);

 

            seT2.SetSelectParams(new SelectParam(Mapping.Test2["Id"], 2));

            t2 = seT2.GetValue();

            t2.Value = "UpdateValue";

            upT2.Entity = t2;

            upT2.Upd();

 

            Console.WriteLine("执行更新t2的SQL语句:");

            Console.WriteLine(upT2.Sql);

            seT1.SetSelectParams(new SelectParam(Mapping.Test1["Id"], 2));

            t1 = seT1.GetValue();

            t1.Name = "UpdateName";

            upT1.Entity = t1;

            upT1.Upd();

            Console.WriteLine("执行更新t1SQL语句");

            Console.WriteLine(upT1.Sql);

 

            //察看数据库是否有更新

            liT1 = seT1.GetValues();

            foreach (ITest1 tii in liT1)

            {

                System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");

            }

 

            //删除(如果有外键,只要在Mapping中设置好,就可以了,那么就不用先删除外键表了,所以只要删除Test3表,那么就会自动先删除外键的表,不用先删除Test1然后再删除Test2最后才能删除Test3)

            IDelete<Mapping, ITest1> deT1 = new Delete<Mapping, ITest1, Test1>(connection);

            IDelete<Mapping, ITest2> deT3 = new Delete<Mapping, ITest2, Test2>(connection);

            IDelete<Mapping, ITest3> deT3 = new Delete<Mapping, ITest3, Test3>(connection);

            seT3.SetSelectParams(new SelectParam(Mapping.Test3["Id"],1));

            t3 = seT3.GetValue();

            deT3.Entity = t3;

            deT3.Del();

            Console.WriteLine("执行删除t3SQL语句");

            Console.WriteLine(deT3.Sql);

 

            //察看数据库是否有更新

            liT1 = seT1.GetValues();

            foreach (ITest1 tii in liT1)

            {

                System.Console.WriteLine("Test1:" + tii.Id + "/t" + tii.Name + "/n外键TId:(Test2)" + tii.TId.Id + "/t" + tii.TId.Value + "/n外键TId:(Test3)" + tii.TId.TId.Id + "/t" + tii.TId.TId.Test + "/n------------------------");

            }

        }

    }

}

 

这些是基本功能,关于高级操作下次连载。。。。。。。。。。。。。。

希望大家提供宝贵的意见!

提取插件:

http://pickup.mofile.com/2811913680810975

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值