//dataset is all data... public string[] Update(DataSet dataSet, string sTable, bool isReplaceCmd, string replaceCmd, int state, string tableName) { _updateDataSet = dataSet; _updateTable = sTable; List<string> sqlSentences = new List<string>(); OpenConn(); _needSyncFVs = false; if (replaceCmd != null && replaceCmd.Length != 0) this.SelectCmd.CommandText = replaceCmd; DataTable dataTable = dataSet.Tables[sTable]; DataTable addedTable = dataTable.GetChanges(DataRowState.Added); DataTable modifiedTable = dataTable.GetChanges(DataRowState.Modified); DataTable deletedTable = dataTable.GetChanges(DataRowState.Deleted); if (addedTable == null && modifiedTable == null && deletedTable == null) return sqlSentences.ToArray(); DataTable schema = new DataTable(); if (!isReplaceCmd) { schema = GetSchema(); } // Get the updatecomp's infotranscations. List<IInfoTransaction> infoTransactions = GetInfoTransactions(); OnBeforeApply(new UpdateComponentBeforeApplyEventArgs()); List<IAutoNumber> autoNumbersList = null; KeyItems keysList = this.SelectCmd.KeyFields; ClientType type = DBUtils.GetDatabaseType(conn); OdbcDBType odbcType = DBUtils.GetOdbcDatabaseType(conn); #region Deleted. if (deletedTable != null && (state == 0 || state == 1)) { foreach (DataRow row in deletedTable.Rows) { // Set the currect row. _currentRow = row; // 替换Command的SQL if (isReplaceCmd) { schema = GetSchema(isReplaceCmd, row, true); } OnBeforeDelete(new UpdateComponentBeforeDeleteEventArgs()); // Sync setfieldvalues if (_needSyncFVs) { SetFieldValueSynchronizer syncer = new SetFieldValueSynchronizer(dataTable, row, schema, _syncFieldValues); if (type == ClientType.ctOracle) { syncer.SyncOracle(); } else { syncer.Sync(); } } _syncFieldValues.Clear(); SQLBuilder builder = new SQLBuilder(this, row, schema); String deleteSQL = ""; String writeBackSQLWherePart = ""; if (type == ClientType.ctMsSql) { deleteSQL = builder.GetDeleteSQL(); writeBackSQLWherePart = builder.GetWriteBackSQLWherePart(); } else if (type == ClientType.ctOleDB) { deleteSQL = builder.GetDeleteSybase(tableName); writeBackSQLWherePart = builder.GetWriteBackSybaseWherePart(); } else if (type == ClientType.ctOracle) { deleteSQL = builder.GetDeleteOracle(); writeBackSQLWherePart = builder.GetWriteBackOracleWherePart(); } else if (type == ClientType.ctODBC) { deleteSQL = builder.GetDeleteOdbc(tableName, odbcType); writeBackSQLWherePart = builder.GetWriteBackOdbcWherePart(odbcType); } else if (type == ClientType.ctMySql) { deleteSQL = builder.GetDeleteMySql(); writeBackSQLWherePart = builder.GetWriteBackMySqlWherePart(); } else if (type == ClientType.ctInformix) { deleteSQL = builder.GetDeleteInformix(tableName); writeBackSQLWherePart = builder.GetWriteBackInformixWherePart(); } IDbCommand deleteCommand = conn.CreateCommand(); deleteCommand.CommandText = deleteSQL; if (trans != null) { deleteCommand.Transaction = trans; } sqlSentences.Add(deleteSQL); if (_logInfo != null) { _logInfo.Log(row, schema, conn, trans, keysList); } try { Int32 i = deleteCommand.ExecuteNonQuery(); if (RowAffectsCheck) { if (i > 1) { String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedMultiRows"); throw new ArgumentException(message); } else if (i == 0) { String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedNotRows"); throw new ArgumentException(message); } } } catch (Exception e) { throw e; } if (infoTransactions != null && infoTransactions.Count != 0) { foreach (InfoTransaction iT in infoTransactions) { if (iT.Update(row, schema, writeBackSQLWherePart, conn, sqlSentences, trans) == true) continue; else throw new Exception(); } } OnAfterDelete(new UpdateComponentAfterDeleteEventArgs()); } } #endregion #region Modified. if (modifiedTable != null && (state == 0 || state == 2)) { foreach (DataRow row in modifiedTable.Rows) { // Set the currect row. _currentRow = row; // 替换Command的SQL if (isReplaceCmd) { schema = GetSchema(isReplaceCmd, row); } OnBeforeModify(new UpdateComponentBeforeModifyEventArgs()); // Sync setfieldvalues if (_needSyncFVs) { SetFieldValueSynchronizer syncer = new SetFieldValueSynchronizer(dataTable, row, schema, _syncFieldValues); if (type == ClientType.ctOracle) { syncer.SyncOracle(); } else { syncer.Sync(); } } _syncFieldValues.Clear(); SQLBuilder builder = new SQLBuilder(this, row, schema); String updateSQL = ""; String writeBackSQLWherePart = ""; IDbCommand updateCommand = conn.CreateCommand(); if (trans != null) { updateCommand.Transaction = trans; } if (type == ClientType.ctMsSql) { updateSQL = builder.GetUpdateSQL(); writeBackSQLWherePart = builder.GetWriteBackSQLWherePart(); } else if (type == ClientType.ctOleDB) { updateSQL = builder.GetUpdateSybase(tableName, updateCommand); writeBackSQLWherePart = builder.GetWriteBackSybaseWherePart(); } else if (type == ClientType.ctOracle) { updateSQL = builder.GetUpdateOracle(updateCommand); writeBackSQLWherePart = builder.GetWriteBackOracleWherePart(); } else if (type == ClientType.ctODBC) { updateSQL = builder.GetUpdateOdbc(tableName, odbcType); writeBackSQLWherePart = builder.GetWriteBackOdbcWherePart(odbcType); } else if (type == ClientType.ctMySql) { updateSQL = builder.GetUpdateMySql(updateCommand); writeBackSQLWherePart = builder.GetWriteBackMySqlWherePart(); } else if (type == ClientType.ctInformix) { updateSQL = builder.GetUpdateInformix(tableName); writeBackSQLWherePart = builder.GetWriteBackInformixWherePart(); } updateCommand.CommandText = updateSQL; if (updateSQL == null || updateSQL.Length == 0) { // throw new Exception(); continue; } sqlSentences.Add(updateSQL); if (_logInfo != null) { _logInfo.Log(row, schema, conn, trans, keysList); } try { Int32 i = updateCommand.ExecuteNonQuery(); if (RowAffectsCheck) { if (i > 1) { String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedMultiRows"); throw new ArgumentException(message); } else if (i == 0) { String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedNotRows"); throw new ArgumentException(message); } } } catch (Exception e) { throw e; } if (infoTransactions != null && infoTransactions.Count != 0) { foreach (InfoTransaction iT in infoTransactions) { if (iT.Update(row, schema, writeBackSQLWherePart, conn, sqlSentences, trans) == true) continue; else throw new Exception(); } } OnAfterModify(new UpdateComponentAfterModifyEventArgs()); } } #endregion #region Added. if (addedTable != null && (state == 0 || state == 2)) { foreach (DataRow row in addedTable.Rows) { // Set the currect row. _currentRow = row; autoNumbersList = GetAutoNumbersList(true); // 替换Command的SQL if (isReplaceCmd) { schema = GetSchema(isReplaceCmd, row); } // UpdateComponent.ServerModify和InfoDataSet.ServerModify、InfoNavigator.AutoApply配合使用。 // if (_serverModify) // { AutoNumberSynchronizer autoNumberSync = new AutoNumberSynchronizer(dataTable, row, schema, autoNumbersList); if (type == ClientType.ctOracle) { autoNumberSync.SyncOracle(); } else if (type == ClientType.ctMySql) { autoNumberSync.SyncMySql(); } else { autoNumberSync.Sync(); } OnBeforeInsert(new UpdateComponentBeforeInsertEventArgs()); // Sync setfieldvalues if (_needSyncFVs) { SetFieldValueSynchronizer syncer = new SetFieldValueSynchronizer(dataTable, row, schema, _syncFieldValues); if (type == ClientType.ctOracle) { syncer.SyncOracle(); } else { syncer.Sync(); } } _syncFieldValues.Clear(); SQLBuilder builder = new SQLBuilder(this, row, schema); String insertSQL = ""; String writeBackSQLWherePart = ""; IDbCommand insertCommand = conn.CreateCommand(); if (trans != null) { insertCommand.Transaction = trans; } if (type == ClientType.ctMsSql) { insertSQL = builder.GetInsertSQL(); writeBackSQLWherePart = builder.GetWriteBackSQLWherePart(); } else if (type == ClientType.ctOleDB) { insertSQL = builder.GetInsertSybase(tableName, insertCommand); writeBackSQLWherePart = builder.GetWriteBackSybaseWherePart(); } else if (type == ClientType.ctOracle) { insertSQL = builder.GetInsertOracle(insertCommand); writeBackSQLWherePart = builder.GetWriteBackOracleWherePart(); } else if (type == ClientType.ctODBC) { insertSQL = builder.GetInsertOdbc(tableName, odbcType); writeBackSQLWherePart = builder.GetWriteBackOdbcWherePart(odbcType); } else if (type == ClientType.ctMySql) { insertSQL = builder.GetInsertMySql(insertCommand); writeBackSQLWherePart = builder.GetWriteBackMySqlWherePart(); } else if (type == ClientType.ctInformix) { insertSQL = builder.GetInsertInformix(tableName); writeBackSQLWherePart = builder.GetWriteBackInformixWherePart(); } insertCommand.CommandText = insertSQL; sqlSentences.Add(insertSQL); // Log if (_logInfo != null) { _logInfo.Log(row, schema, conn, trans, keysList); } try { Int32 i = insertCommand.ExecuteNonQuery(); if (RowAffectsCheck) { if (i > 1) { //Object[] clientInfos = ((DataModule)OwnerComp).ClientInfo; String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedMultiRows"); throw new ArgumentException(message); } else if (i == 0) { //Object[] clientInfos = ((DataModule)OwnerComp).ClientInfo; String message = SysMsg.GetSystemMessage(((DataModule)this.OwnerComp).Language, "Srvtools", "UpdateComponent", "msg_AffectedNotRows"); throw new ArgumentException(message); } } } catch (Exception e) { throw e; } if (infoTransactions != null && infoTransactions.Count != 0) { foreach (InfoTransaction iT in infoTransactions) { if (iT.Update(row, schema, writeBackSQLWherePart, conn, sqlSentences, trans) == true) continue; else throw new Exception(); } } OnAfterInsert(new UpdateComponentAfterInsertEventArgs()); //String tableName = schema.Rows[0]["BaseTableName"].ToString(); ; //DataRow identityRow = GetIdentityRow(tableName, writeBackSQLWherePart); //if (identityRow != null) //{ // IdentitySynchronizer identitySync = new IdentitySynchronizer(dataTable, row, schema, identityRow); // identitySync.Sync(); //} } } #endregion OnAfterApply(new UpdateComponentAfterApplyEventArgs()); return sqlSentences.ToArray(); }
public void IdentitySync(DataSet dataSet, String sTable, String realTableName) { DataSet insertedDS = dataSet.GetChanges(DataRowState.Added); if (insertedDS == null || insertedDS.Tables.Count == 0 || insertedDS.Tables[0].Rows.Count == 0) { return; } DataTable schema = GetSchema(); String tableName = String.Empty; if (!String.IsNullOrEmpty(realTableName)) { tableName = realTableName; } else { //DataTable schema = GenerateSchema(); tableName = schema.Rows[0]["BaseTableName"].ToString(); //给表加上owner by Rei String schemaName = schema.Rows[0]["BaseSchemaName"].ToString(); if (schemaName != null && schemaName != "") tableName = schemaName + "." + tableName; } DataTable dataTable = dataSet.Tables[sTable]; ClientType type = DBUtils.GetDatabaseType(conn); string origiantable = DBUtils.GetTableName(SelectCmd.CommandText, true); foreach (DataRow r in insertedDS.Tables[0].Rows) { string wherePart = ""; DataRow identityRow = null; if (ServerModifyGetMax) { KeyItems keys = SelectCmd.KeyFields; string columnName = ""; if (keys == null || keys.Count == 0) columnName = dataTable.Columns[0].ColumnName; else columnName = ((KeyItem)keys[0]).KeyName; wherePart = origiantable + "." + DBUtils.QuoteWords(columnName, type) + " in " + "(select max(" + DBUtils.QuoteWords(columnName, type) + ") from " + DBUtils.QuoteWords(tableName, type) + ")"; } else { SQLBuilder builder = new SQLBuilder(this, r, schema); if (this.SelectCmd != null) { if (this.conn != null) { if (type == ClientType.ctOracle) { wherePart = builder.GetIdenSelectOracleWherePart(); } else if (type == ClientType.ctOleDB) { wherePart = builder.GetIdenSelectSybaseWherePart(); } else { wherePart = builder.GetIdenSelectSQLWherePart(); } } } } if (wherePart == null || wherePart.Length == 0) continue; identityRow = GetIdentityRow(tableName, wherePart); if (identityRow != null) { IdentitySynchronizer identitySync = new IdentitySynchronizer(dataTable, r, schema, identityRow); identitySync.Sync(); } } }