利用反射插入数据库与更新数据库
public int Insert<T>(T m) where T : class { PropertyInfo[] pInfos = m.GetType().GetProperties(); FieldInfo[] fInfos = m.GetType().GetFields();
List<string> lstCol = new List<string>(); List<OleDbParameter> lstParam = new List<OleDbParameter>();
for (int i = 0; i < pInfos.GetLength(0); i++) { PropertyInfo pInfo = pInfos[i]; object value = pInfo.GetValue(m, null); string name = pInfo.Name; string DeclarType = pInfo.PropertyType.Name; if (DeclarType.ToUpper().Contains("DateTime".ToUpper())) { value = ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss.fff"); }
lstCol.Add(name); lstParam.Add(new OleDbParameter("@" + name, value)); }
string Keys = " " + string.Join(",", lstCol.ToArray()); string Values = " " + "@" + string.Join(",@", lstCol.ToArray());
string sql; sql = @"Insert into " + GetTableName() + "(" + Keys + ")values(" + Values + ")";
string ErrorMsg; return DBAHelp.DBA_ExecuteNonQuery(sql, (OleDbParameter[])(lstParam.ToArray()), out ErrorMsg);
}
public int Update<T>(T m, string UpdateKey) where T : class { string FullName = m.GetType().FullName; T mNew = Activator.CreateInstance(m.GetType()) as T;
PropertyInfo[] pInfos = m.GetType().GetProperties(); PropertyInfo[] pInfosNew = mNew.GetType().GetProperties();
List<string> lstCol = new List<string>(); List<OleDbParameter> lstParam = new List<OleDbParameter>();
OleDbParameter KeyParam = null; string sKey = "";
for (int i = 0; i < pInfos.GetLength(0); i++) { PropertyInfo pInfo = pInfos[i]; object value = pInfo.GetValue(m, null); string name = pInfo.Name;
PropertyInfo pInfoNew = pInfosNew[i]; object valueNew = pInfoNew.GetValue(mNew, null);
if (UpdateKey.ToUpper() == name.ToUpper()) { KeyParam = new OleDbParameter("@" + name, value); sKey = name + "=@" + name; } else if (!value.Equals(valueNew)) { string Line = name + "=@" + name; lstCol.Add(Line); lstParam.Add(new OleDbParameter("@" + name, value)); } }
string Lines = string.Join(",", lstCol.ToArray()); if (KeyParam != null) { lstParam.Add(KeyParam); }
string sql; sql = @"Update " + GetTableName() + " Set " + Lines + " Where " + sKey + "";
string ErrorMsg; return DBAHelp.DBA_ExecuteNonQuery(sql, (OleDbParameter[])(lstParam.ToArray()), out ErrorMsg); }
利用反射插入数据库与更新数据库
标签:
小编还为您整理了以下内容,可能对您也有帮助:
.net 反射机制与数据库如何结合使用?
我的理解,就是通过反射,来将实体类的属性和数据库的字段一一对应起来。
一个实体对象,就相当于数据库里的一条记录,而一个实体对象的属性,就对应了数据库里一条记录的某一列的值。
因此如果你的实体类的属性和数据库里的列名之间存在一定的关系,那么就可以通过反射机制,写一个通用的方法,来将数据库的每一条记录装载进对应的实体类,而不用像以前一样每一个表转换为实体的时候都要写一大堆的 model.Name = dr["Name"].ToString() 之类的代码了。
java:为什么要使用反射技术?直接用get,set方法不行吗?
举个简单的例子吧,你有一套系统,根据不同版本连接多重不同的数据库,通过反射的方式,你可以通过传递一个字符串的方式来调用某个数据库连接类的方法。如果用set,get方法的话,每新增加一个数据库,就需要新增加一个方法,也就是说需要修改原有的已经写好的类。而使用反射,直接创建一个新的类,然后直接调用就可以了,无需修改任何原有的类。当然这个例子举的很菜鸟,希望你能理解。
在sql中, statement, PreparedStatement有什么用?
(1) Statement —— SQL语句执行接口
Statement接口代表了一个数据库的状态,在向数据库发送相应的SQL语句时,都需要创建Statement接口或者PreparedStatement接口。在具体应用中,Statement主要用于操作不带参数(可以直接运行)的SQL语句,比如删除语句、添加或更新。
(2) PreparedStatement —— SQL语句预编译接口
PreparedStatement也执行相应的SQL语句。它继承于Statement接口,除了具备Statement所有功能,还可以对SQL语句进行预处理。
主要方法:
① ResultSet executeQuery() throws SQLException
在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。从不返回 null;如果发生数据库访问错误或者 SQL 语句没有返回ResultSet 对象则抛出SQLException异常。
② int executeUpdate() throws SQLException
在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL INSERT、UPDATE 或 DELETE 语句;或者是一个什么都不返回的 SQL 语句,比如 DDL 语句。
返回值int表示影响的记录条数,一条都没有则返回0;
③ boolean execute()throws SQLException
在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。
有结果集则返回true, 没有结果集则返回false;
④各种set方法
将指定位置的参数设置为指定的类型。比如ps.setString(3, “tarena”);
(3) ResultSet —— 结果集操作接口
ResultSet接口是查询结果集接口,它对返回的结果集进行处理。ResultSet是程序员进行JDBC操作的必需接口。
(4) ResultSetMetaData —— 元数据操作接口
ResultSetMetaData是对元数据进行操作的接口,可以实现很多高级功能。Hibernate运行数据库的操作,大部分都是通过此接口。可以认为,此接口是SQL查询语言的一种反射机制。ResultSetMetaData接口可以通过数组的形式,遍历数据库的各个字段的属性,对于我们开发者来说,此机制的意义重大。
JDBC通过元数据(MetaData)来获得具体的表的相关信息,例如,可以查询数据库中有哪些表,表有哪些字段,以及字段的属性等。MetaData中通过一系列getXXX将这些信息返回给我们。
数据库元数据 Database MetaData 使用connection.getMetaData()获得
MetaData包括: 包含了关于数据库整体元数据信息。
结果集元数据 Result Set MetaData 使用resultSet.getMetaData()获得
比较重要的是获得表的列名、列数等信息。
元数据对象:ResultSetMetaData meta = rs.getMetaData();
字段个数:meta.getColomnCount();
字段名字:meta.getColumnName();
字段JDBC类型:meta.getColumnType();
字段数据库类型:meta.getColumnTypeName();
反射有什么作用 java反射机制有什么用
1、Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性),无需提前硬编码目标类。这些特性使得反射 特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。
2、但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相 对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性 能问题才变得至关重要。
3、许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问 题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方 ——记录其在目标类中的使用。