`
njmnjx
  • 浏览: 235846 次
  • 性别: 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
分享到:
评论

相关推荐

    泛型工具类

    在这样的场景下,`GenericUtil`类可以被用来动态获取每个DAO实例所处理的实体类型,进而执行特定于该类型的数据库操作,如查询、插入、更新或删除。例如,可以通过反射机制,结合`GenericUtil`提供的类型信息,动态...

    C#泛型、反射实例、自动生成sql语句

    泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的类型转换。这提高了代码的复用性和安全性。在C#中,我们可以定义泛型类、泛型接口、泛型方法等。例如,...

    对DAL数据访问层的封装,一个泛型接口,一个实现泛型接口的父类

    在.NET开发领域,数据访问层(DAL)是应用程序与数据库交互的重要组成部分,它负责处理所有与数据相关的操作,如查询、插入、更新和删除记录。在这个特定的案例中,我们看到的是一个使用了Entity Framework(EF)...

    ssh通用泛型DAO

    2. 更新(Update):通过`update()`方法更新已存在的实体对象。 3. 删除(Delete):使用`delete()`方法删除指定ID的实体对象。 4. 查询(Find):包括根据ID获取单个对象的`get()`方法,以及查询所有对象的`list()`...

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

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

    java增删改查JDBC封装类(泛型封装)

    - 这种设计使得在插入、更新、删除和查询时,无需手动指定列名和类型,只需传入对应的实体对象即可。 5. **示例:`SqlServerConn`**: - `SqlServerConn`可能是一个针对SQL Server数据库的连接类,封装了JDBC连接...

    基于泛型与反射的万能数据库操作代码

    1. **类型安全**:使用泛型可以确保在 Dao 中插入、查询和更新的数据类型与我们的实体类类型匹配,避免了类型转换异常。 2. **自动转换**:通过泛型,我们可以直接在 Dao 中返回所需类型的对象,无需手动进行强制...

    java 基于泛型与反射的通用 DAO

    通过这种方式,我们可以创建一个通用的DAO类,不指定具体的实体类,但在子类中指定时,编译器会进行类型检查,避免了类型转换的麻烦。 接着,我们讨论“反射”。反射是Java提供的一个强大的工具,允许程序在运行时...

    泛型解决方案

    这样,一个DAO实例就能处理任何符合特定接口或基类的数据实体,实现插入、更新、删除等操作。 3. CRUD操作:插入(Create)、读取(Read)、更新(Update)和删除(Delete)是数据库操作的基本功能。泛型可以帮助...

    反射泛型完美版分页.rar

    5. **灵活性**:由于使用了反射和泛型,这个分页系统可能对查询的实体类没有特定要求,能够处理各种类型的对象,使得它在各种项目中都具有很高的重用性。 6. **效率优化**:可能通过缓存、预编译SQL等方式来提升...

    接口+泛型+函数式编程案例

    在Java编程中,接口...5. 实体类的设计:`Production`和`Customer`代表业务实体,可能通过接口和泛型实现通用功能。 通过分析这些文件,开发者可以深入理解如何在实际项目中结合使用这些Java特性来解决问题。

    JdbcTemplate通用泛型Dao实现

    通过定义一个泛型接口,我们可以创建一个通用的数据访问对象(DAO),这个DAO可以处理任何类型的实体类,只要它们遵循一定的规则,比如拥有ID字段。这样,我们就只需要编写一次DAO的实现,就可以为不同的数据表提供...

    Java反射泛型,实现数据库的动态增删改查等功能

    在动态数据库操作中,泛型可以用来创建通用的DAO(数据访问对象)接口和实现,以处理不同类型的实体对象。例如,我们可以定义一个`GenericDAO&lt;T&gt;`接口,其中`T`代表任何数据模型类。这个接口可以包含`insert(T ...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    2. **JdbcTemplate操作**:你可以通过`@Autowired`注入特定数据源的`JdbcTemplate`实例,然后调用其方法执行SQL。例如: ```java @Autowired private JdbcTemplate primaryJdbcTemplate; @Autowired private ...

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

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

    Java Web程序运用中泛型DAO的作用.zip

    例如,当我们使用泛型DAO来操作User对象时,尝试插入一个Order对象会引发编译错误。 2. **代码复用**:泛型DAO可以为不同的实体类提供通用的方法,如增删查改等,减少了重复代码,提高了开发效率。只需要针对不同...

    vs2008 针对数据表记录的维护做了一个类似实体的写法,里面用到了反射

    在这个场景中,提到的是使用VS2008处理数据表记录的一种高级技巧,即通过创建一个类似实体的表示方式来简化数据操作,同时利用了.NET框架中的反射机制。以下将详细解释这个概念以及如何实现。 反射是.NET框架中的一...

    一个简单的Hibernate泛型Dao的实现 ---- 20160624

    这个类的核心在于它的泛型设计,允许我们为任何类型的实体对象提供数据访问服务。例如,如果我们有一个`User`实体,我们可以创建一个`UserDao`类继承自`AbstractHibernateGenericDao&lt;User&gt;`,这样就无需为每个实体类...

    C++数据结构 清华大学版 清华大学版

    在书中,作者通过实例解释了数据结构的概念,例如使用"学生"和"课程"表格来展示数据元素和它们的关系。这些表格代表了现实世界中的实体,如学生、课程和选课信息,它们之间的关联构成了数据结构的基础。 抽象数据...

    武汉大学 C#数据结构与算法

    利用泛型,可以创建适用于多种数据类型的通用数据结构。 5. **课程内容**:可能包括基础数据结构的实现、算法设计与分析、复杂度理论、高级数据结构(如堆、B树等)、图算法、排序与查找算法的C#实现、动态规划和...

Global site tag (gtag.js) - Google Analytics