public void AutoProcess(DbTransaction transaction, DataTable dataTable, ExistingItemProcessType processType) { if (dataTable.TableName.Length == 0) { throw new Exception("表名为空"); } if (dataTable.Rows.Count == 0) { return; } string sql = ""; bool owerConnection = transaction == null; DbConnection conn = null; DbTransaction tran = null; try { ConstraintCollection ucList = GetTableConstraint(dataTable.TableName); if (ucList.Count == 0) { AutoInsert(null, dataTable); return; } if (owerConnection) { conn = CreateConnection(); conn.Open(); tran = conn.BeginTransaction(); } else { conn = transaction.Connection; tran = transaction; } //sql = "select * from " + dt.TableName; //DataSet ds = ExecuteDataset(tran, sql); sql = "select count(*) from " + dataTable.TableName + " where "; Dictionary <string, bool> keyColumnList = new Dictionary <string, bool>(); foreach (UniqueConstraint uc in ucList) { if (uc == null || uc.Columns.Length == 0) { continue; } foreach (DataColumn dc in uc.Columns) { keyColumnList[dc.ColumnName] = true; } } int idx = 0; foreach (string columnName in keyColumnList.Keys) { if (idx > 0) { sql += " and "; } sql += columnName + "=:" + columnName; ++idx; } DataSet dsTable = GetTableInfo(dataTable.TableName); DataTable dtInsert = dataTable.Clone(); DataTable dtExist = dataTable.Clone(); foreach (DataRow dr in dataTable.Rows) { DbParameter[] pList = new DbParameter[keyColumnList.Keys.Count]; idx = 0; foreach (DataRow dr2 in dsTable.Tables[0].Rows) { if (keyColumnList.ContainsKey(dr2["cname"].ToString())) { pList[idx] = DbFactory <OracleConn, OracleFactory <OracleConn> > .MakeInParam(":" + dr2["cname"].ToString(), OracleDbTypeWrapper.WrapDbType(dr2["coltype"].ToString()), Convert.ToInt32(dr2["width"]), dr[dr2["cname"].ToString()]); ++idx; } } bool bContain = Convert.ToInt32(ExecuteScalar(tran, CommandType.Text, sql, pList)) > 0; if (!bContain) { dtInsert.ImportRow(dr); } else { dtExist.ImportRow(dr); } } if (dtInsert.Rows.Count > 0) { AutoInsert(tran, dtInsert); } if (processType == ExistingItemProcessType.Update && dtExist.Rows.Count > 0) { AutoUpdate(tran, dtExist); } if (owerConnection) { tran.Commit(); } } catch (System.Exception ex) { if (owerConnection) { tran.Rollback(); } throw new CustomDataException(ex, sql); } finally { if (owerConnection && conn != null) { conn.Close(); } } }
public void AutoProcess(DataTable dataTable, ExistingItemProcessType processType) { AutoProcess(null, dataTable, processType); }