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