/// <summary> /// 向表中增加记录 /// </summary> /// <param name="descObject">实体类</param> /// <param name="tableName">表名称</param> /// <param name="keyName">主键名</param> /// <param name="isAutoIncCol">主键是否是自动增长列</param> public void InsertTableRec(object descObject, string tableName, string keyName, bool isAutoIncCol) { string sqlStatement = string.Empty; string sqlStatement2 = "insert into [" + tableName + "]("; string sqlStatement3 = " values("; Type type = descObject.GetType(); foreach (PropertyInfo info in type.GetProperties()) { if (isAutoIncCol) { if (info.Name.ToLower().Equals(keyName)) { continue; } } sqlStatement2 = sqlStatement2 + info.Name + ","; if (info.PropertyType.ToString().Equals("System.String")) { sqlStatement3 = sqlStatement3 + "'" + (type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null) as string).Replace("'", "''") + "',"; } else if (info.PropertyType.ToString().Equals("System.Boolean")) { if ((bool)type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) { sqlStatement3 = sqlStatement3 + "1,"; } else { sqlStatement3 = sqlStatement3 + "0,"; } } else if (info.PropertyType.ToString().Equals("System.Int32")) { sqlStatement3 = sqlStatement3 + ((int)type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) + ","; } else if (info.PropertyType.ToString().Equals("System.Int64")) { sqlStatement3 = sqlStatement3 + ((long)type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) + ","; } else if (info.PropertyType.ToString().Equals("System.Double")) { sqlStatement3 = sqlStatement3 + ((double)type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) + ","; } else if (info.PropertyType.ToString().Equals("System.Decimal")) { sqlStatement3 = sqlStatement3 + ((decimal)type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) + ","; } else if (info.PropertyType.ToString().Equals("System.DateTime")) { if (Convert.ToDateTime(type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) == DateTime.MinValue) { sqlStatement3 = sqlStatement3 + "null,"; } else { sqlStatement3 = sqlStatement3 + "cast('" + Convert.ToString(type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null)) + "' as datetime),"; } } else { sqlStatement3 = sqlStatement3 + (type.InvokeMember(info.Name, BindingFlags.GetProperty, null, descObject, null) as string) + ","; } } sqlStatement = sqlStatement2.Substring(0, sqlStatement2.Length - 1) + ") " + sqlStatement3.Substring(0, sqlStatement3.Length - 1) + ")"; IDbOperation db = new SqlServerExecute(); db.ExecuteNonQuery(sqlStatement); }
/// <summary> /// 自动更新表 /// </summary> /// <param name="transaction"></param> /// <param name="dataTable"></param> public void AutoUpdate(DbTransaction transaction, DataTable dataTable) { DataSet dsTable = GetSqlTableInfo(dataTable.TableName); if (null == dsTable || dsTable.Tables.Count == 0 || dsTable.Tables[0].Rows.Count == 0) { throw new CustomDataException("未找到 " + dataTable.TableName + " 表的信息"); } ConstraintCollection ucList = GetSqlTableConstraint(dataTable.TableName); if (ucList.Count == 0) { throw new CustomDataException("表 " + dataTable.TableName + " 没有主键,无法自动更新"); } Dictionary <string, bool> keyTable = new Dictionary <string, bool>(); foreach (UniqueConstraint uc in ucList) { if (uc == null || uc.Columns.Length == 0) { continue; } foreach (DataColumn dc in uc.Columns) { keyTable[dc.ColumnName] = true; } } StringBuilder sb = new StringBuilder(); sb.Append("update "); sb.Append(dataTable.TableName); int idx = 0; foreach (DataRow drTable1 in dsTable.Tables[0].Rows) { string cName = drTable1["cname"].ToString(); if (dataTable.Columns.Contains(cName) && !keyTable.ContainsKey(cName)) { if (idx == 0) { sb.Append(" set "); } else { sb.Append(", "); } sb.Append(cName); sb.Append(" = @"); sb.Append(cName); ++idx; } } if (idx == 0) { return; } idx = 0; foreach (UniqueConstraint uc in ucList) { if (uc == null || uc.Columns.Length == 0) { continue; } foreach (DataColumn dc in uc.Columns) { if (idx == 0) { sb.Append(" where "); } else { sb.Append(" and "); } sb.Append(dc.ColumnName); sb.Append(" = @"); sb.Append(dc.ColumnName); ++idx; } } string sql = sb.ToString(); DbParameter[] parameters = null; try { foreach (DataRow dr in dataTable.Rows) { List <DbParameter> paramList = new List <DbParameter>(); foreach (DataRow drTable in dsTable.Tables[0].Rows) { string cName2 = drTable["cname"].ToString(); if (!dataTable.Columns.Contains(cName2)) { continue; } DbType dbt = SqlServerDbTypeWrapper.WrapSqlDbType(drTable["coltype"].ToString()); object objValue = dr.IsNull(cName2) ? null : dr[cName2]; paramList.Add(DbFactory <SqlServerConn, SqlServerFactory <SqlServerConn> > .MakeInParam("@" + cName2, dbt, Convert.ToInt32(drTable["width"]), objValue)); } parameters = paramList.ToArray(); IDbOperation db = new SqlServerExecute(); if (transaction == null) { db.ExecuteNonQuery(sql, parameters); } else { db.ExecuteNonQuery(transaction, sql, parameters); } } } catch (System.Exception ex) { throw new CustomDataException(ex, sql, parameters); } }
/// <summary> /// 复制表结构及主键、唯一键 /// </summary> /// <param name="srcTableName">源表</param> /// <param name="destTableName">新表名称,必须是不存在的</param> public void CopyTableStruct(string srcTableName, string destTableName) { if (srcTableName == destTableName) { throw new CustomDataException("源表和目标表名称冲突"); } string sql = string.Empty; try { ConstraintCollection ucList = GetSqlTableConstraint(srcTableName); //sql = "create table " + destTableName + " as select * from " + srcTableName + " where 1=2"; //上面语句为Oracle数据库中的复制表结构的Sql语句 //下面语句为SqlServer数据库中复制表结构的Sql语句 sql = "select * into " + destTableName + " from " + srcTableName + " where 1 = 2"; IDbOperation db = new SqlServerExecute(); db.ExecuteNonQuery(sql); // 添加主键、唯一键约束 foreach (UniqueConstraint uc in ucList) { if (uc == null || uc.Columns.Length <= 0) { continue; } string newConstraintName = uc.ConstraintName; if (newConstraintName.IndexOf(srcTableName) > -1) { newConstraintName = newConstraintName.Replace(srcTableName, destTableName); } else { newConstraintName += "_" + destTableName; } StringBuilder sb = new StringBuilder("alter table "); sb.Append(destTableName); sb.Append(" add constraint "); sb.Append(newConstraintName); if (uc.IsPrimaryKey) { sb.Append(" primary key ("); } else { sb.Append(" unique ("); } for (int i = 0; i < uc.Columns.Length; ++i) { if (i > 0) { sb.Append(", "); } sb.Append(uc.Columns[i].ColumnName); } sb.Append(")"); sql = sb.ToString(); IDbOperation dbOperation = new SqlServerExecute(); dbOperation.ExecuteNonQuery(sql);; } } catch (CustomDataException exdb) { throw exdb; } catch (System.Exception ex) { throw new CustomDataException(ex, sql); } }
/// <summary> /// 将源表中的数据插入到表中(含事务) /// </summary> /// <param name="transaction">事务</param> /// <param name="dt">表名</param> public void AutoInsert(DbTransaction transaction, DataTable dt) { DataSet dataSet = GetSqlTableInfo(dt.TableName); if (null == dataSet || dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count == 0) { throw new CustomDataException("未找到 " + dt.TableName + " 表的信息"); } StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); foreach (DataRow drTable1 in dataSet.Tables[0].Rows) { string cName = drTable1["cname"].ToString(); if (dt.Columns.Contains(cName)) { if (sb1.Length > 0) { sb1.Append(", "); sb2.Append(", "); } sb1.Append(cName); sb2.Append("@" + cName); } } if (sb1.Capacity == 0) { return; } string sql = "insert into " + dt.TableName + " (" + sb1.ToString() + ") values (" + sb2.ToString() + ")"; DbParameter[] parameters = null; try { foreach (DataRow dr in dt.Rows) { List <DbParameter> paramList = new List <DbParameter>(); foreach (DataRow drTable in dataSet.Tables[0].Rows) { string cName2 = drTable["cname"].ToString(); if (!dt.Columns.Contains(cName2)) { continue; } DbType dbt = SqlServerDbTypeWrapper.WrapSqlDbType(drTable["coltype"].ToString()); object objValue = dr.IsNull(cName2) ? null : dr[cName2]; paramList.Add(DbFactory <SqlServerConn, SqlServerFactory <SqlServerConn> > .MakeInParam("@" + cName2, dbt, Convert.ToInt32(drTable["width"]), objValue)); } parameters = paramList.ToArray(); IDbOperation db = new SqlServerExecute(); if (transaction == null) { db.ExecuteNonQuery(sql, parameters); } else { db.ExecuteNonQuery(transaction, sql, parameters); } } } catch (System.Exception ex) { throw new CustomDataException(ex, sql, parameters); } }