/// <summary>
		/// Salva no banco de dados as alterações em uma tabela.
		/// </summary>
		/// <param name="dt">A tabela</param>
		/// <param name="state">
		/// O estado que estará sendo processado. Pode ser 
		/// <see cref="DataViewRowState.Added"/>, 
		/// <see cref="DataViewRowState.ModifiedCurrent"/> ou 
		/// <see cref="DataViewRowState.Deleted"/>
		/// </param>
		/// <returns>O número de registros atualizados</returns>
		protected int CommitTable(DataTable dt, DataViewRowState state)
		{
			int c = 0;

			if (dt != null && dt.Rows.Count > 0)
			{
				try
				{
					using (new PhysicalTableAdapter(conn, dt))
					using (AdpDataAdapter da = new AdpDataAdapter())
					{
						DataRow[] rows = dt.Select(null, null, state);

						if (rows.Length > 0)
						{
							if (!conn.BuildCommands(da, dbConn, dt))
								new AdpCommandBuilder(da, dbConn, dt);

							if (trans != null)
								SetTransaction(da);

							if (state == DataViewRowState.Added)
								c += CommitInserts(dt, da, rows);
							else
								c += da.Update(rows);
						}
					}
				}
				catch (Exception ex)
				{
					throw ConnectorExceptionFactory.FromDatabaseException(ex).Detail("Error while updating data table named {0}", dt.TableName);
				}
			}
			return c;
		}
        protected override void CommitChanges()
        {
            try
            {
                IEnumerator en      = rows.GetEnumerator();
                bool        hasNext = en.MoveNext();
                while (hasNext)
                {
                    DataRow row = (DataRow)en.Current;

                    DataTable dt = row.Table;
                    using (new PhysicalTableAdapter(conn, dt))
                        using (AdpDataAdapter da = new AdpDataAdapter())
                        {
                            if (!conn.BuildCommands(da, dbConn, dt))
                            {
                                new AdpCommandBuilder(da, dbConn, dt);
                            }

                            if (trans != null)
                            {
                                SetTransaction(da);
                            }

                            do
                            {
                                if (row.RowState == DataRowState.Added)
                                {
                                    CommitInserts(dt, da, row);                             // HACK: otimizar para enviar todas a serem inseridas ao mesmo tempo
                                }
                                else
                                {
                                    da.Update(row);
                                }

                                // repete enquanto houverem mais linhas da mesma tabela
                                row = (hasNext = en.MoveNext()) ? (DataRow)en.Current : null;
                            } while (hasNext && Object.ReferenceEquals(row.Table, dt));
                        }
                }
            }
            catch (Exception ex)
            {
                if (ex is ConnectorException)
                {
                    throw;
                }
                else
                {
                    throw ConnectorExceptionFactory.FromDatabaseException(ex);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Salva no banco de dados as alterações em uma tabela.
        /// </summary>
        /// <param name="dt">A tabela</param>
        /// <param name="state">
        /// O estado que estará sendo processado. Pode ser
        /// <see cref="DataViewRowState.Added"/>,
        /// <see cref="DataViewRowState.ModifiedCurrent"/> ou
        /// <see cref="DataViewRowState.Deleted"/>
        /// </param>
        /// <returns>O número de registros atualizados</returns>
        protected int CommitTable(DataTable dt, DataViewRowState state)
        {
            int c = 0;

            if (dt != null && dt.Rows.Count > 0)
            {
                try
                {
                    using (new PhysicalTableAdapter(conn, dt))
                        using (AdpDataAdapter da = new AdpDataAdapter())
                        {
                            DataRow[] rows = dt.Select(null, null, state);

                            if (rows.Length > 0)
                            {
                                if (!conn.BuildCommands(da, dbConn, dt))
                                {
                                    new AdpCommandBuilder(da, dbConn, dt);
                                }

                                if (trans != null)
                                {
                                    SetTransaction(da);
                                }

                                if (state == DataViewRowState.Added)
                                {
                                    c += CommitInserts(dt, da, rows);
                                }
                                else
                                {
                                    c += da.Update(rows);
                                }
                            }
                        }
                }
                catch (Exception ex)
                {
                    throw ConnectorExceptionFactory.FromDatabaseException(ex).Detail("Error while updating data table named {0}", dt.TableName);
                }
            }
            return(c);
        }
		protected override void CommitChanges()
		{
			try
			{
				IEnumerator en = rows.GetEnumerator();
				bool hasNext = en.MoveNext();
				while (hasNext)
				{
					DataRow row = (DataRow) en.Current;

					DataTable dt = row.Table;
					using (new PhysicalTableAdapter(conn, dt))
					using (AdpDataAdapter da = new AdpDataAdapter())
					{
						if (!conn.BuildCommands(da, dbConn, dt))
							new AdpCommandBuilder(da, dbConn, dt);
					
						if (trans != null) 
							SetTransaction(da);
						
						do 
						{
							if (row.RowState == DataRowState.Added)
								CommitInserts(dt, da, row); // HACK: otimizar para enviar todas a serem inseridas ao mesmo tempo
							else
								da.Update(row);

							// repete enquanto houverem mais linhas da mesma tabela
							row = (hasNext = en.MoveNext()) ? (DataRow) en.Current : null;
						} while (hasNext && Object.ReferenceEquals(row.Table, dt));
					}
				}
			}
			catch (Exception ex)
			{
				if (ex is ConnectorException)
					throw;
				else
					throw ConnectorExceptionFactory.FromDatabaseException(ex);
			}
		}
		/// <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;
			}
		}
Ejemplo n.º 6
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;
            }
        }