示例#1
0
        /// <summary>
        /// Insere as linhas na base de dados.
        /// </summary>
        /// <param name="dt">A tabela com as linhas a serem inseridas</param>
        /// <param name="da">O <see cref="AdpDataAdapter"/> a ser utilizado</param>
        /// <param name="rows">As linhas a serem inseridas</param>
        /// <returns>O número de linhas inseridas</returns>
        protected int CommitInserts(DataTable dt, AdpDataAdapter da, params DataRow[] rows)
        {
            int c = 0;

            AdpCommand autoIncCmd = null;
            DataColumn autoIncCol = null;

            // procura pela coluna de auto-incremento
            foreach (DataColumn col in dt.PrimaryKey)
            {
                if (col.AutoIncrement)
                {
                    autoIncCol = col;
                    break;
                }
            }

            // se não houver coluna de auto-incremento, realiza o update normal.
            if (autoIncCol == null)
            {
                return(da.Update(rows));
            }

            // procura pelo comando de busca do auto-incremento
            if (dbConn.Provider is MsSqlProvider)
            {
                autoIncCmd             = dbConn.CreateCommand();
                autoIncCmd.CommandText = "SELECT IDENT_CURRENT('" + dt.TableName + "')";
                autoIncCmd.Transaction = trans;
            }

            // se não encontra o comando, realiza o update normal
            if (autoIncCmd == null)
            {
                Debug.WriteLine("Provider not supported: " + dbConn.Provider);
                return(da.Update(rows));
            }

            // se está tudo certo, pode começar:

            // prepara o comando de auto-incremento
            autoIncCmd.Prepare();

            bool oldRO = autoIncCol.ReadOnly;

            try
            {
                autoIncCol.ReadOnly = false;

                foreach (DataRow row in rows)
                {
                    // atualiza linha a linha
                    c += da.Update(row);

                    // busca o conteúdo do auto-incremento
                    object id = autoIncCmd.ExecuteScalar();
                    if (!(id is DBNull))
                    {
                        // se houver resultado, atualiza a linha do DataSet
                        row[autoIncCol] = id;
                        row.AcceptChanges();
                    }
                }

                // retorna a quantidade de linhas atualizadas
                return(c);
            }
            finally
            {
                // devolve o estado de "read-only" à linha
                autoIncCol.ReadOnly = oldRO;
            }
        }
 public void Prepare()
 {
     cmd.Prepare();
 }