示例#1
0
        //-----------------------------------------------------------------------------------------

        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");
            }
        }
示例#2
0
        //-----------------------------------------------------------------------------------------

        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);
            }
        }