zoukankan      html  css  js  c++  java
  • .NET 利用反射将对象数据添加到数据库

     

    .NET 利用反射将对象数据添加到数据库

     

     

     

    一些小型的项目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,这时候一些反复的增删改查就会让我们感到极其的繁琐,厌烦,为了避免这种情况出现,本人写了一个小的工具类.自动将实体类添加到数据库.

    实现功能的思路:

      1,通过反射获取该对象名称和所有属性名称,然后组合成insert SQL字符串

      (前提是对象属性名称和数据库字段名称一致,表名称和实体类名称一致.不区分大小写).

      2,通过反射获取该对象的每个属性值,并动态的往已经定义好的SqlParameter数组里添加SqlParameter,

      SqlParameter参数的名称与属性名称一致. 

      3,执行SQL。

    开始代码:

      CODE_1,定义方法命名先,第一参数是需要插入数据的对象实例,第二个参数是自动增长的主键名称(不区分大小写)

    public static int Insert(Object obj, string identityName)
    {
    }

      CODE_2,反射获取对象数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    StringBuilder commandText = new StringBuilder(" insert into ");
     Type type = obj.GetType();
    string tableName = type.Name;//表名称
    PropertyInfo[] pros = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);//所有字段名称
    StringBuilder fieldStr = new StringBuilder();//拼接需要插入数据库的字段
      StringBuilder paramStr = new StringBuilder();//拼接每个字段对应的参数
    int len = pros.Length;
      if (!"".Equals(identityName) && null != identityName) param = new SqlParameter[len-1];//如果有自动增长的字段,则该字段不需要SqlParameter
      int paramLIndex = 0;
      for (int i = 0; i < len; i++)
      {
        string fieldName = pros[i].Name;
          if (!fieldName.ToUpper().Equals(identityName.ToUpper()))
          {//非自动增长字段才加入SQL语句
            fieldStr.Append(fieldName);
              string paramName = "@" + fieldName;//SQL语句的字段名称和参数名称保持一致
                paramStr.Append(paramName);
              if (i < (len - 1))
              {
                fieldStr.Append(",");//参数和字段用逗号隔开
                    paramStr.Append(",");
              }
              object val = type.GetProperty(fieldName).GetValue(obj, null);// 根据属性名称获取当前属性的值
                if (val == null) val = DBNull.Value;//如果该值为空的话,则将其转化为数据库的NULL
              param[paramLIndex] = new SqlParameter(fieldName, val);//给每个参数赋值
                paramLIndex++;
          }
       }
                   
       commandText.Append(tableName);
       commandText.Append(" ( ");
       commandText.Append(fieldStr);
       commandText.Append(" ) values ( ");
       commandText.Append(paramStr);
       commandText.Append(" ) ");//拼接成完整的字符串
     
     DBHelp.ExcuteSave(commandText.ToString(), param)//执行该INSERT SQL 语句

    最后一行执行SQL语句的代码就不需要再说了吧..... 

    其实如果能自动生成指定数据库的实体类,那么又减轻的一些繁琐的工作,下一篇我将会写到如何根据指定的数据库生成简单的实体类

    反射需要引用到的控件名称为

    using System.Reflection;

    SubSonic3.0使用外连接查询时查询不出数据的问题修改

      今天在开发时,要使用到外连接查询,如图

      

      老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕

      

      然后继续Debug,发现原来SqlQuery类在调用LeftInnerJoin函数时传入的Join.JoinType.LeftInner参数,并没有被CreateJoin函数使用上,如下图

      

      所以赶快修改为type,见图

      

      心想应该可以了吧......继续执行程序,发现还是没有查询出数据来~~~真是郁闷......继续Debug,发现SQL语句还是有问题,见图

      

      语句中多了一个INNER,所以查询直接爆错退出了,继续跟踪Debug,但是找来找去都没有发现在哪里组合语句的,@_@

      认真研究了一下,发现是从Join类的GetJoinTypeValue函数返回连接字符串的,如下图

      

      就尝试修改了一下返回的字串,见图

      

      最后执行程序,生成的SQL语句终于正常了

      

      这个Bug其实并不是很复杂,只要多使用Debug跟踪,多尝试修改(就算改错了也无所谓),才能找出问题所在

      

      本文章为原创内容,转载请保留下面信息。

      发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:SubSonic3.0学习群(327360708)或Email给我(1654937#qq.com),大家一起探讨,由于本人工作很繁忙,如果疑问请先留言,回复不及时也请谅解。

      想了解更多SubSonic3.0的相关问题,请观注博客:http://www.cnblogs.com/EmptyFS/

  • 相关阅读:
    数据结构——第二章 线性结构
    数据结构——第一章 绪论
    2018年
    Node笔记(2)
    Node笔记(1)
    公务员考试
    cf-789A (思维)
    cf188C(最大子段和&&思维)
    zzuli1731 矩阵(容斥)
    九余数定理(同余定理)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3335815.html
Copyright © 2011-2022 走看看