//----------------------------------------------------------------------------------------- protected SaveEnum ExecuteForceSave_TryInsertFirstˡ(SqlCommand cmd, T row, SqlConnection conn, SqlTransaction tran, List <SqlParameter> parameters, CodeGenSaveStrategy saveStrategy, string insert, string insertIdentity, string update, string delete, string whereSavePK, // no concurrency column here, just PK bool identityTable, bool identityProvided, out object identityID) { string sql = ""; identityID = null; // try insert if (identityTable) { if (identityProvided) { sql = insertIdentity + " ; select scope_identity() "; } else { sql = insert + " ; select scope_identity() "; } } else { sql = insert; } CodeGenEtc.Sql = sql; cmd.CommandText = sql; if (identityTable) { object id = cmd.ExecuteScalar(); if (id == null) { throw new ApplicationException("0 rows inserted, expected exactly 1 to be inserted."); } identityID = id; return(SaveEnum.Insert); } else { int rowsEffected = cmd.ExecuteNonQuery(); if (rowsEffected == 1) { return(SaveEnum.Insert); } } // last chance - try update if (update.Length > 0) // only update if there are fields to update { sql = update + whereSavePK; CodeGenEtc.Sql = sql; cmd.CommandText = sql; int rowsEffected = cmd.ExecuteNonQuery(); if (rowsEffected > 1) { throw new ApplicationException(string.Format("{0} rows updated, expected 0 or 1 to be updated.", rowsEffected)); } if (rowsEffected == 1) // update ok { return(SaveEnum.Update); } throw new ApplicationException("0 rows updated, expected exactly 1 to be updated."); } else { throw new ApplicationException("Nothing was saved - no update fields"); } }
//----------------------------------------------------------------------------------------- protected SaveEnum ExecuteForceSaveˡ(T row, SqlConnection conn, SqlTransaction tran, List <SqlParameter> parameters, CodeGenSaveStrategy saveStrategy, string insert, string insertIdentity, string update, string delete, string whereSavePK, // no concurrency column here, just PK bool identityTable, bool identityProvided, out object identityID) { // ignore all flags except _MarkForDeletion identityID = null; string sql = ""; CodeGenEtc.Sql = ""; insert = string.Format(insert, this.TableFqˡ); insertIdentity = string.Format(insertIdentity, this.TableFqˡ); update = string.Format(update, this.TableFqˡ); delete = string.Format(delete, this.TableFqˡ); try { using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; if (tran != null) { if (cmd.Transaction == null) { cmd.Transaction = tran; } } cmd.CommandTimeout = CodeGenEtc.Timeout; cmd.Parameters.AddRange(parameters.ToArray()); // do delete if (row.MarkForDeletionˡ) { sql = delete + whereSavePK; CodeGenEtc.Sql = sql; cmd.CommandText = sql; int rowsEffected = cmd.ExecuteNonQuery(); if (rowsEffected > 1) { throw new ApplicationException(string.Format("{0} rows deleted, expected 0 or 1 to be deleted.", rowsEffected)); } return(SaveEnum.Delete); } // do update then insert if (saveStrategy == CodeGenSaveStrategy.ForceSaveTryUpdateFirstThenInsert) { return(this.ExecuteForceSave_TryUpdateFirstˡ(cmd, row, conn, tran, parameters, saveStrategy, insert, insertIdentity, update, delete, whereSavePK, identityTable, identityProvided, out identityID)); } // do insert then update if (saveStrategy == CodeGenSaveStrategy.ForceSaveTryInsertFirstThenUpdate) { return(this.ExecuteForceSave_TryInsertFirstˡ(cmd, row, conn, tran, parameters, saveStrategy, insert, insertIdentity, update, delete, whereSavePK, identityTable, identityProvided, out identityID)); } throw new ApplicationException("Unexpected force save strategy"); } } catch (Exception ex) { throw new CodeGenSaveException(ex.Message, ex, CodeGenEtc.Sql, parameters, row); } }