/// <summary>
		/// Cria um novo comando que encapsula uma chamada a uma Stored Procedure.
		/// </summary>
		/// <param name="conn">A conexão que será utilizada</param>
		/// <param name="procedureName">O nome da Stored Procedure</param>
		public StoredProcedureCommand(AdpConnection conn, string procedureName)
		{
			this.cmd = conn.CreateCommand();
			this.cmd.CommandType = CommandType.StoredProcedure;
			this.cmd.CommandText = procedureName;
			this.cmd.CommandTimeout = DefaultCommandTimeout;
		}
 /// <summary>
 /// Cria um novo comando que encapsula uma chamada a uma Stored Procedure.
 /// </summary>
 /// <param name="conn">A conexão que será utilizada</param>
 /// <param name="procedureName">O nome da Stored Procedure</param>
 public StoredProcedureCommand(AdpConnection conn, string procedureName)
 {
     this.cmd                = conn.CreateCommand();
     this.cmd.CommandType    = CommandType.StoredProcedure;
     this.cmd.CommandText    = procedureName;
     this.cmd.CommandTimeout = DefaultCommandTimeout;
 }
		/// <summary>
		/// Cria um novo comando que encapsula uma chamada a uma Stored Procedure,
		/// e roda em uma transação.
		/// </summary>
		/// <param name="trans">A transação que será utilizada</param>
		/// <param name="procedureName">O nome da Stored Procedure</param>
		public StoredProcedureCommand(AdpTransaction trans, string procedureName)
		{
			this.cmd = trans.Connection.CreateCommand();
			this.cmd.Transaction = trans;
			this.cmd.CommandType = CommandType.StoredProcedure;
			this.cmd.CommandText = procedureName;
			this.cmd.CommandTimeout = DefaultCommandTimeout;
		}
 /// <summary>
 /// Cria um novo comando que encapsula uma chamada a uma Stored Procedure,
 /// e roda em uma transação.
 /// </summary>
 /// <param name="trans">A transação que será utilizada</param>
 /// <param name="procedureName">O nome da Stored Procedure</param>
 public StoredProcedureCommand(AdpTransaction trans, string procedureName)
 {
     this.cmd                = trans.Connection.CreateCommand();
     this.cmd.Transaction    = trans;
     this.cmd.CommandType    = CommandType.StoredProcedure;
     this.cmd.CommandText    = procedureName;
     this.cmd.CommandTimeout = DefaultCommandTimeout;
 }
예제 #5
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;
            }
        }