⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbbaseoperation.cs

📁 一个通用的数据库访问层
💻 CS
字号:
using System;
using System.Data;
using System.Data.OleDb;
using YariSoft.Utils;
using System.Windows.Forms;
using System.Collections;

namespace YariSoft.DBUtil
{
	public enum RowOperation {
		RO_None,
		RO_Append,
		RO_Overwrite,
		RO_Overwrite_All,
		RO_Skip,
		RO_Skip_All
	}

	public class DBBaseOperation
	{
		public delegate bool OnDataChangedEventHandler( object Sender );

		public event OnDataChangedEventHandler OnSourceDataChanged	= null;
		public event OnDataChangedEventHandler OnDestinationDataChanged	= null;

		#region Protected variables
		protected DataView source			= null;
		protected DataView destination		= null;
		protected OleDbConnection connection= null;
		protected ArrayList selectedRows	= null;
		protected YProgress progress		= null;
		#endregion

		#region Local variables
		private bool _showProgress = true;
		protected bool increaseProgress = true;
		#endregion

		#region Properties
		public bool ShowProgress
		{
			set{ this._showProgress = value; }
			get{ return this._showProgress; }
		}
		#endregion

		#region Constructor/Destructor
		public DBBaseOperation()
		{
		}

		public DBBaseOperation( OleDbConnection Connection, ArrayList SelectedRows )
			:this( Connection, null, SelectedRows )
		{
		}

		public DBBaseOperation( OleDbConnection Connection, DataView Source, ArrayList SelectedRows )
		{
			this.source = Source;
			this.selectedRows = SelectedRows;
			this.connection = Connection;
		}

		~DBBaseOperation(){
			this.Dispose();
		}

		public virtual void Dispose()
		{
			if( this.progress != null ){
				this.progress.Dispose();
			}
		}
		#endregion

		#region Public functions
		public virtual bool Exec()
		{
			bool status = true;
			ConnectionState previousConnectionState = this.connection.State;
			
			try{
				if( previousConnectionState == ConnectionState.Closed ){
					this.connection.Open();
				}

				this.PrepareProgress( this.selectedRows.Count, this.GetProgressCaption(),  this.GetProgressMessage());
				status = this.BeforeProcess();

				if( this.increaseProgress ){
					for( int i = 0; !this.progress.Cancel && status && i < this.selectedRows.Count; i++ ){
						this.Process( i, ref status );
					}
				} else {
					for( int i = this.selectedRows.Count - 1; !this.progress.Cancel && status && i >= 0; i-- ){
						this.Process( i, ref status );
					}
				}

				if( status ){
					status = this.AfterProcess();
				}

			} catch ( Exception Exp ) {
				string message = Exp.Message;
				message += "\r\nTrace:\r\n";
				message += Exp.StackTrace;

				YariSoft.Utils.YMessages.Show( message, "Error ( IOperation.Exec )", MessageBoxButtons.OK, MessageBoxIcon.Error );
				status = false;
			}

			if( previousConnectionState == ConnectionState.Closed ){
				this.connection.Close();
			}
			return status;		
		}
		#endregion

		#region Protected functions
		protected virtual string GetProgressCaption()
		{
			return "";
		}
		protected virtual string GetProgressMessage()
		{
			return "";
		}
		protected virtual bool ExecOperation( int Position )
		{
			return true;
		}
		protected virtual bool BeforeProcess()
		{
			return true;
		}
		protected virtual bool AfterProcess()
		{
			return true;
		}
		#endregion

		#region Private functions
		private void Process( int Position, ref bool Status )
		{
			Status = this.ExecOperation( Position );
			if( ! Status ){
				return;
			}
			this.SetProgressValue( Position );
			if( this.OnSourceDataChanged != null ){
				Status = this.OnSourceDataChanged ( this.source.Table );
			}
			if( this.OnDestinationDataChanged != null ){
				Status = this.OnDestinationDataChanged ( this.destination.Table );
			}

		}

		private void PrepareProgress( int Maximum, string ProgressFormText, string OperationText )
		{
			if( this.ShowProgress ){
				this.progress = new YariSoft.Utils.YProgress ();
				this.progress.Maximum = Maximum;
				this.progress.Text = ProgressFormText;
				this.progress.OperationCaption = OperationText;
			}
		}

		private void SetProgressValue( int Value )
		{
			if( this.ShowProgress ){
				this.progress.Value = Value;
			}
		}
		#endregion
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -