`
njmnjx
  • 浏览: 232249 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过泛型插入(更新)实体数据

SQL 
阅读更多
/// <summary>
/// 通过泛型插入数据
/// </summary>
/// <typeparam name="T">类名称</typeparam>
/// <param name="obj">类对象,如果要插入空值,请使用@NULL</param>
/// <returns>插入的新记录ID</returns>
public static int Insert<T>(T obj)
{

      StringBuilder strSQL = new StringBuilder();

      strSQL = GetInsertSQL(obj);

      // 插入到数据库中
      object result = SQLPlus.ExecuteScalar(CommandType.Text, strSQL, null);

      return Convert.IsDBNull(result) ? 0 : Convert.ToInt32(result);
}

/// <summary>
/// 通过泛型更新数据
/// </summary>
/// <typeparam name="T">类名称</typeparam>
/// <param name="obj">类对象,如果要更新空值,请使用@NULL</param>
/// <returns>更新结果,大于0为更新成功</returns>
public static int Update<T>(T obj)
{

     StringBuilder strSQL = new StringBuilder();
     strSQL = GetUpdateSQL(obj);

     if (String.IsNullOrEmpty(strSQL.ToString()))
     {
          return 0;
     }


     // 更新到数据库中
     object result = SQLPlus.ExecuteNonQuery(CommandType.Text, strSQL, null);

     int returnValue = Convert.IsDBNull(result) ? 0 : Convert.ToInt32(result);

     return returnValue;

}

/// <summary>
/// 获取实体的插入语句
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="obj">实体对象</param>
/// <returns>返回插入语句</returns>
public static StringBuilder GetInsertSQL<T>(T obj)
{

      string tableKey = GetPropertyValue(obj, BaseSet.PrimaryKey);
      string keyValue = GetPropertyValue(obj, tableKey);
      string tableName = GetPropertyValue(obj, BaseSet.TableName);

      Type t = obj.GetType();//获得该类的Type

      StringBuilder strSQL = new StringBuilder();

      strSQL.Append("insert into " + tableName + "(");

      string fields = "";
      string values = "";

      //再用Type.GetProperties获得PropertyInfo[]
      foreach (PropertyInfo pi in t.GetProperties())
      {

           object name = pi.Name;//用pi.GetValue获得值

           // 替换Sql注入符
           string value1 = Convert.ToString(pi.GetValue(obj, null)).Replace("'", "''");

           //string dataType = pi.PropertyType.ToString().ToLower();

           string properName = name.ToString().ToLower();

           if (!string.IsNullOrEmpty(value1) && properName != tableKey.ToLower() && properName != BaseSet.PrimaryKey.ToLower() && properName != BaseSet.TableName.ToLower() && value1 != BaseSet.DateTimeLongNull && value1 != BaseSet.DateTimeShortNull)
           {
                // 判断是否为空
                if (value1 == BaseSet.NULL)
                {
                    value1 = "";
                }

                fields += Convert.ToString(name) + ",";
                values += "'" + value1 + "',";

           }

       }

       // 去掉最后一个,
       fields = fields.TrimEnd(',');
       values = values.TrimEnd(',');

       // 拼接Sql串
       strSQL.Append(fields);
       strSQL.Append(") values (");
       strSQL.Append(values);
       strSQL.Append(")");

       strSQL.Append(";SELECT @@IDENTITY;");

       return strSQL;
}

/// <summary>
/// 获取实体的更新SQL串
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="obj">实体对象</param>
/// <returns>返回插入语句</returns>
private static StringBuilder GetUpdateSQL<T>(T obj)
{

     string tableKey = GetPropertyValue(obj, BaseSet.PrimaryKey);
     string keyValue = GetPropertyValue(obj, tableKey);
     string tableName = GetPropertyValue(obj, BaseSet.TableName);
     StringBuilder strSQL = new StringBuilder();

     if (string.IsNullOrEmpty(keyValue))
     {
          return strSQL;
     }

     Type t = obj.GetType();//获得该类的Type

     strSQL.Append("update " + tableName + " set ");

     string subSQL = "";

     string condition = " where " + tableKey + "='" + keyValue.Replace("'", "''") + "'";


     //再用Type.GetProperties获得PropertyInfo[]
     foreach (PropertyInfo pi in t.GetProperties())
     {

          object name = pi.Name;//用pi.GetValue获得值

          // 替换Sql注入符
          string value1 = Convert.ToString(pi.GetValue(obj, null)).Replace("'", "''");

          //string dataType = pi.PropertyType.ToString().ToLower();

          string properName = name.ToString().ToLower();

          if (!string.IsNullOrEmpty(value1) && properName != tableKey.ToLower() && properName != BaseSet.PrimaryKey.ToLower() && properName != BaseSet.TableName.ToLower() && value1 != BaseSet.DateTimeLongNull && value1 != BaseSet.DateTimeShortNull)
          {
               // 判断是否为空
               if (value1 == BaseSet.NULL)
               {
                   value1 = "";
               }

               subSQL += Convert.ToString(name) + "='" + value1 + "',";

          }

     }

     // 去掉最后一个,
     subSQL = subSQL.TrimEnd(',');

     // 拼接上更新子句
     strSQL.Append(subSQL);

     // 加入更新条件
     strSQL.Append(condition);

     return strSQL;

}

public class BaseSet
{
    public static string NULL
    {
         get { return "@null"; }

    }

    public static string DateTimeShortNull
    {
         get { return "0001-1-1 0:00:00"; }

    }

    public static string DateTimeLongNull
    {
         get { return "0001-01-01 00:00:00"; }

    }

    public static string PrimaryKey
    {
         get { return "PrimaryKey"; }

    }

    public static string TableName
    {
         get { return "TableName"; }

    }
}

#region 实体样例
[Serializable]
public class SortsInfo
{
     private int _SortID;
     private string _SortName;
     public string TableName
     {
         get { return "Sorts"; }
     }
     public string PrimaryKey
     {
         get { return "SortID"; }
     }
     public int SortID
     {
         get { return _SortID; }
         set
         {
             _SortID = value;
         }
     }
     public string SortName
     {
         get { return _SortName; }
         set
         {
             _SortName = value;
         }
     }

}

#endregion
分享到:
评论

相关推荐

    控制台程序【泛型+反射】

    5 进阶需求:提供泛型的数据库实体插入、实体更新、ID删除数据的数据库访问方法; 6 进阶需求(可选):欢迎小伙伴儿写个实体自动生成器; 7 进阶需求(可选):将数据访问层抽象,使用简单工厂+配置文件+反射的方式...

    自动生成数据库表映射的实体对象以及可直接调用此实体的数据访问层基类

    解压后得到sp_GenerateEntity.sql在SQL Server中执行,...BaseDAL.cs是使用实体进行数据插入更新删除等操作的数据访问层基类,使用了单态模式和泛型,可以省去很多代码。 此方式使用LINQ To SQL不需要建立dbml文件。

    230202-022shopDemo(分布式缓存强制移除泛型注销器定义实现之IConsumer)

    /// 在指定实体的1个实例执行持久化插入新操作后,为该实体实例的分布式缓存的强制移除操作提供数据支撑,从而为新变更的实例缓存操作,预留出相应的内存空间。 /// &lt;/remarks&gt; /// public virtual async Task...

    多功能.NET代码自动生成器(含存储过程)

    将单条记录xml数据更新到数据库 13、JSON数据源相关 注:json数据源中totalProperty属性为数据源总记录条数,root属性下是具体数据表记录信息,数据表记录信息中各key为小写字段名称,值均为字符串类型。 示例: { ...

    多功能.NET代码自动生成器2.0版(2010年最新修改)

    将单条记录xml数据更新到数据库 13、JSON数据源相关 注:json数据源中totalProperty属性为数据源总记录条数,root属性下是具体数据表记录信息,数据表记录信息中各key为小写字段名称,值均为字符串类型。 示例: { '...

    .net源码生成工具DataBase2Sharp

     5、Enterprise Library代码生成,生成整个项目工程框架,包含实体类、数据访问类、业务类、Asp.net页面类,利用泛型及缓存机制,良好的架构极大简化代码,强大完善的基类使你甚至不用编写一行代码。  6、可以查看...

    java-entitymanager-generic-dao:使用 Hibernate EntityManager (Spring Boot) 的通用 Dao

    在这个实现中,我们使用 Spring Framework ORM EntityManager 使用预配置的数据源来实现基本操作,例如从数据库中插入、更新、删除和检索实体。 这种实现的主要优点是,由于这个 dao 是使用 Java 泛型实现的,我们...

    ASP.NET.4揭秘

    12.1.5 使用detailsview控件更新数据445 12.1.6 使用detailsview控件插入数据452 12.1.7 使用detailsview控件删除数据455 12.1.8 detailsview控件的事件456 12.1.9 格式化detailsview控件459 12.2 使用formview控件...

    ASP.NET 控件的使用

    12.1.5 使用DetailsView控件更新数据 390 12.1.6 使用DetailsView控件插入数据 396 12.1.7 使用DetailsView控件删除数据 398 12.1.8 DetailsView控件的事件 399 12.1.9 格式化DetailsView控件 401 12.2 使用FormView...

    java-session-generic-dao:用于 Hibernate ORM (JSE) 的通用数据访问对象的非常简单的实现

    在这个实现中,我们使用通过 AnnotationConfiguration 从 hibernate.cfg.xml 文件创建的 Hibernate ORM Session 来实现基本操作,例如从数据库中插入、更新、删除和检索实体。 这种实现的主要优点是,由于这个 dao ...

    AppFramework_V1.0

    根据主键获取实体 &lt;br&gt;(20次单条select) 17.5 13.3 &lt;br&gt;QueryFilter:14.5 1.32 &lt;br&gt;1.21 插入实体 &lt;br&gt;(20次insert) 36.1 17.4 2.07 更新实体 &lt;br&gt;(20...

    AppFramework_V1.0_New

    14.5 1.32 &lt;br&gt;1.21 &lt;br&gt;插入实体 &lt;br&gt;(20次insert) 36.1 17.4 2.07 &lt;br&gt;更新实体 &lt;br&gt;(20次单条update) 23.5 15.9 &lt;br&gt;SqlMap:20.3 1.48 &lt;br&gt;1.16 &lt;br&gt;查询结果集...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    18.0 1.23 &lt;br&gt;1.10 &lt;br&gt;每秒插入实体 &lt;br&gt;(20次insert) 41 21 1.95 &lt;br&gt;更新实体 &lt;br&gt;(20次单条update) 27 19 &lt;br&gt;SqlMap:24 1.42 &lt;br&gt;1.13 &lt;br&gt;查询结果集(平均101...

    领域驱动设计与模式实战

    7.8.1 使验证接口成为可插入的 7.8.2 在保存方面实现被动验证的替代解决方案 7.8.3 重用映射元数据 7.9 使用泛型和匿名方法 7.10 其他人都做了什么 7.11 小结 第三部分 应用PoEAA 第8章 用于持久化的基础架构 8.1 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例186 泛型方法与数据查询 236 实例187 泛型化方法与最小值 238 实例188 泛型化接口与最大值 239 实例189 使用通配符增强泛型 240 实例190 泛型化的折半查找法 241 第9章 编程常用类 343 9.1 Calendar类的使用 244...

Global site tag (gtag.js) - Google Analytics