869 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			869 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*********************************************************************************************
 | |
|  * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | |
|  * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
|  * ------------------------------------------------------------------------------
 | |
|  * $Workfile: VDB.cs $     $Revision: 9 $
 | |
|  * $Author: Kathy $   $Date: 8/16/05 2:53p $
 | |
|  *
 | |
|  * $History: VDB.cs $
 | |
|  * 
 | |
|  * *****************  Version 9  *****************
 | |
|  * User: Kathy        Date: 8/16/05    Time: 2:53p
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * B2005-030: error if missing ndx
 | |
|  * 
 | |
|  * *****************  Version 8  *****************
 | |
|  * User: Kathy        Date: 5/19/05    Time: 11:05a
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * speed up approve
 | |
|  * 
 | |
|  * *****************  Version 7  *****************
 | |
|  * User: Jsj          Date: 5/17/05    Time: 11:54a
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * cleanup
 | |
|  * 
 | |
|  * *****************  Version 6  *****************
 | |
|  * User: Kathy        Date: 5/11/05    Time: 9:28a
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * add selectinto method
 | |
|  * 
 | |
|  * *****************  Version 5  *****************
 | |
|  * User: Kathy        Date: 4/21/05    Time: 10:18a
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * if dbt is < 512, make it 512
 | |
|  * 
 | |
|  * *****************  Version 4  *****************
 | |
|  * User: Kathy        Date: 3/08/05    Time: 1:47p
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * Approval
 | |
|  * 
 | |
|  * *****************  Version 3  *****************
 | |
|  * User: Jsj          Date: 8/20/04    Time: 4:44p
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * backed out previous change
 | |
|  * 
 | |
|  * *****************  Version 2  *****************
 | |
|  * User: Jsj          Date: 8/20/04    Time: 1:14p
 | |
|  * Updated in $/LibSource/VDB
 | |
|  * Added logic to handle a single quote in a string that is in an SQL
 | |
|  * statement.
 | |
|  * 
 | |
|  * *****************  Version 1  *****************
 | |
|  * User: Kathy        Date: 7/27/04    Time: 8:40a
 | |
|  * Created in $/LibSource/VDB
 | |
|  *********************************************************************************************/
 | |
| 
 | |
| using System;
 | |
| using System.Data;
 | |
| using System.Data.OleDb;
 | |
| using System.Collections.Specialized;
 | |
| using System.IO;
 | |
| using System.Windows.Forms;
 | |
| using System.Text;
 | |
| using VDB_ConnType;
 | |
| 
 | |
| namespace VDB
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// This the base class for a VE-PROMS database (table)
 | |
| 	/// The vdbDBConnType class allows us to setup a default database type (ex dBase)
 | |
| 	/// and gives us a cential place to add logic that would allow the end user select
 | |
| 	/// the type of database (engine) to use via a configuration file (for example).
 | |
| 	/// The virtual functions requires the class, that inherits this base class, 
 | |
| 	/// to define the SQL statements needed for its database operations.
 | |
| 	/// </summary>
 | |
| 	public abstract class VDB_Base
 | |
| 	{
 | |
| 		private vdb_DBConnType databaseType;
 | |
| 		// made this public so that abstract functions that define SQL statements
 | |
| 		// can check the type of database (if needed).
 | |
| 		public int databaseTypeValue;
 | |
| 		private OleDbConnection dbConn;
 | |
| 
 | |
| 		private string strDBPath = ""; //database directory path
 | |
| 		private string strDBFile = ""; // database file name with extension
 | |
| 		private string strDBTable = ""; // database file name without extension
 | |
| 		private string strSelectCommand;
 | |
| 		private string[] DBExtensions={"DBF","DBT"};
 | |
| 
 | |
| 		public VDB_Base(string strPath)
 | |
| 		{
 | |
| 			ParsePathAndFile(strPath);
 | |
| 			databaseType = new vdb_DBConnType(); // currently defaults to dBase
 | |
| 			databaseTypeValue = databaseType.dbType;
 | |
| 
 | |
| 			// check if dbt is at least 512, if not append 508 bytes. This is to fix
 | |
| 			// a problem where dbts were created with only 4 bytes in the 16-bit code.
 | |
| 			if ( isdBaseFile() && File.Exists(strDBTable+".dbt") )
 | |
| 			{
 | |
| 				FileInfo fi = new FileInfo(strDBTable + ".dbt");
 | |
| 				if (fi.Length<512)
 | |
| 				{
 | |
| 					FileStream fs = new FileStream(strDBTable+".dbt",FileMode.Open,FileAccess.Write,FileShare.ReadWrite);
 | |
| 					BinaryWriter bw = new BinaryWriter(fs);
 | |
| 					bw.Seek(0,SeekOrigin.End);
 | |
| 					byte []wrBytes = new byte[512-fi.Length];
 | |
| 					for (int i=0; i<512-fi.Length; i++) wrBytes[i]=0;
 | |
| 					wrBytes[4]=0x02;
 | |
| 					bw.Write(wrBytes);
 | |
| 					bw.Close();
 | |
| 				}
 | |
| 				fi = null;
 | |
| 			}
 | |
| 			dbConn = new OleDbConnection(databaseType.ConnectionString(strDBPath,""));
 | |
| 			
 | |
| 			// if needed, create an INF file with index file names listed or if
 | |
| 			// index file(s) don't exist, create them (B2005-030)
 | |
| 			if ( isdBaseFile() &&  File.Exists(strDBFile))
 | |
| 				CheckIndxAndINF();
 | |
| 		}
 | |
| 
 | |
| 		private void ParsePathAndFile(string strInPath)
 | |
| 		{
 | |
| 			// do we have a file name with the path?
 | |
| 			if (File.Exists(strInPath))
 | |
| 			{
 | |
| 				// Get the Path
 | |
| 				int lastSlash = strInPath.LastIndexOf("\\");
 | |
| 				if (lastSlash > 0) 
 | |
| 				{
 | |
| 					strDBPath = strInPath.Substring(0,lastSlash);
 | |
| 					lastSlash++; // move past slash
 | |
| 				}
 | |
| 				else // current directory path
 | |
| 				{
 | |
| 					strDBPath = ".\\";
 | |
| 					lastSlash=0;
 | |
| 				}
 | |
| 
 | |
| 				// Get the file (with extension)
 | |
| 				strDBFile = strInPath.Substring(lastSlash);
 | |
| 
 | |
| 				//Get the file (without extension)
 | |
| 				strDBTable = strDBFile;
 | |
| 				int lastDot = strDBFile.LastIndexOf(".");
 | |
| 				if (lastDot >0 ) // trim off the extension
 | |
| 					strDBTable = strDBFile.Substring(0,lastDot);
 | |
| 			}
 | |
| 			else // no file name, just a path to database directory
 | |
| 			{
 | |
| 				strDBPath = strInPath;
 | |
| 				if (strDBPath.Length == 0) // empty string for path
 | |
| 					strDBPath = ".\\"; // current directory path
 | |
| 				strDBFile = "";
 | |
| 				strDBTable = "";
 | |
| 			}
 | |
| 				
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		public string DBPath //database directory path
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return strDBPath;
 | |
| 			}
 | |
| 
 | |
| 			set 
 | |
| 			{
 | |
| 				strDBPath = value.ToString();
 | |
| 			}
 | |
| 		}
 | |
| 		public string DBFile // database file name with extension
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return strDBFile;
 | |
| 			}
 | |
| 			// I don't think was want to set the file name
 | |
| //			set
 | |
| //			{
 | |
| //				strDBFile = value.ToString();
 | |
| //			}
 | |
| 		}
 | |
| 
 | |
| 		public string DBTable // also dBase file name without extension
 | |
| 		{ 
 | |
| 			get
 | |
| 			{
 | |
| 				return strDBTable;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				string tmp = value.ToString();
 | |
| 				// If a path was passed in inore it.  The connection already
 | |
| 				// has a path associated with it and we don't want to get it angry.
 | |
| 				int j = tmp.LastIndexOf("\\");
 | |
| 				if ((j>0) && tmp[j] == '\\')
 | |
| 					tmp = tmp.Substring(j+1);
 | |
| 
 | |
| 				tmp = tmp.ToUpper();
 | |
| 				// if there is a file extension, chop it off but save it to assign
 | |
| 				// to the strDBFile property
 | |
| 				j = tmp.LastIndexOf(".");
 | |
| 				if ((j>0) && tmp[j] == '.') // got an extension
 | |
| 				{
 | |
| 					strDBFile = tmp;
 | |
| 					strDBTable = tmp.Substring(0,j);
 | |
| 				}
 | |
| 				else // no extension, assign the table name
 | |
| 				{
 | |
| 					strDBTable = tmp;
 | |
| 					// if we're connected to dBase, then Tables are Files,
 | |
| 					// So create a strDBFile by added .DBF to the table name
 | |
| 					if (isdBaseFile())
 | |
| 						strDBFile = tmp + ".DBF";
 | |
| 				}
 | |
| 
 | |
| 				// We assigned the strDBTable (DBTable property) with a table name.
 | |
| 				// Now we need to make sure there is a corresponding INF file
 | |
| 				// for dBase index file information.
 | |
| 					CreateINF();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| /***
 | |
| 		// To have single quote in a sql command string, you need to 
 | |
| 		// represent it as '' (two single quotes)
 | |
| 		private string FixSingleQuotes(string sqlcmd)
 | |
| 		{
 | |
| 			string tmpstr1 = "(,= ";
 | |
| 			string tmpstr2 = "), ";
 | |
| 			string rtnstr = "";
 | |
| 			int idx = 0;
 | |
| 			int st = 0;
 | |
| 			bool twoquotes;
 | |
| 			int len = sqlcmd.Length;
 | |
| 
 | |
| 			while ((idx = sqlcmd.IndexOf("'",st)) >= 0)
 | |
| 			{
 | |
| 				twoquotes = true;
 | |
| 				// is there a "(", comma , "=", or a space before the quote?
 | |
| 				// if so then we do not want to add another quote
 | |
| 				// because it part of the sql command, not the string
 | |
| 				if (idx > 0 && (tmpstr1.IndexOf(sqlcmd[idx-1]) >= 0))
 | |
| 					twoquotes = false;
 | |
| 
 | |
| 				// is there a ")", comma, or a space after the quote?
 | |
| 				// if so then we do not want to add another quote
 | |
| 				// because it part of the sql command, not the string
 | |
| 				if (twoquotes)
 | |
| 					if (idx > 0 && (idx == len) || (tmpstr2.IndexOf(sqlcmd[idx+1]) >= 0))
 | |
| 						twoquotes = false;
 | |
| 
 | |
| 				// If there is already a second quote, then increment idx past
 | |
| 				// it and set twoqotes to false.
 | |
| 				if (twoquotes)
 | |
| 				{
 | |
| 					if (sqlcmd[idx+1] == '\'')
 | |
| 					{
 | |
| 						idx++; // second quote already there
 | |
| 						twoquotes = false;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				rtnstr += sqlcmd.Substring(st,(idx-st)+1);
 | |
| 
 | |
| 				if (twoquotes)
 | |
| 				{
 | |
| 						rtnstr += "'"; // add a second quote
 | |
| 				}
 | |
| 				twoquotes = false;
 | |
| 				idx++;
 | |
| 				st = idx;
 | |
| 			}
 | |
| 			rtnstr += sqlcmd.Substring(st);
 | |
| 			
 | |
| 			return rtnstr;
 | |
| 		}
 | |
| ***/
 | |
| 		// Process a list of SQL commands.  If an error occures, return 1
 | |
| 		private int ProcessSQLCommands (OleDbCommand cmdSQL,StringCollection strColl)
 | |
| 		{
 | |
| 			int errs =0;
 | |
| 			foreach (string sqlcmd in strColl)
 | |
| 			{
 | |
| 				try
 | |
| 				{
 | |
| /***
 | |
| 					string fixedSqlCmd = FixSingleQuotes(sqlcmd);
 | |
| 					cmdSQL.CommandText = fixedSqlCmd; //sqlcmd;
 | |
| ***/
 | |
| 					cmdSQL.CommandText = sqlcmd;
 | |
| 					cmdSQL.ExecuteNonQuery();
 | |
| 				}
 | |
| 				catch (Exception err)
 | |
| 				{
 | |
| 					errs = 1;
 | |
| 					MessageBox.Show(err.Message.ToString(),"ProcessSQLCommands Error");
 | |
| 				}
 | |
| 			}
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		//memo strings of greater than 255 where getting truncated and needed a separate
 | |
| 		// reader.
 | |
| 		public string GetMemo(string RecId)
 | |
| 		{
 | |
| 			string retstr=null;
 | |
| 			OleDbCommand cmd=null;
 | |
| 			OleDbDataReader dr = null;
 | |
| 			StringBuilder tmp = new StringBuilder();
 | |
| 			tmp.Append("SELECT [TEXTM] FROM [");
 | |
| 			tmp.Append(DBTable);
 | |
| 			tmp.Append("] WHERE RECID = '");
 | |
| 			tmp.Append(RecId);
 | |
| 			tmp.Append("'");
 | |
| 			try
 | |
| 			{
 | |
| 				dbConn.Open();
 | |
| 				cmd = new OleDbCommand(tmp.ToString(),dbConn);
 | |
| 				dr = cmd.ExecuteReader();
 | |
| 				if (dr.Read())retstr = dr.GetString(0);
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show(e.Message,"VDB Error");
 | |
| 				retstr = null;
 | |
| 			}
 | |
| 			if (dr !=null) dr.Close();
 | |
| 			if (cmd != null) cmd.Dispose();
 | |
| 			dbConn.Close();
 | |
| 			return retstr;
 | |
| 		}
 | |
| 
 | |
| 		// The default SQL statement will get all of the records in a database
 | |
| 		// This should be suitable for all of our database, but just in case
 | |
| 		// it can be overloaded.
 | |
| 		public virtual string DefaultSelectCommand()
 | |
| 		{
 | |
| 			StringBuilder tmp = new StringBuilder();
 | |
| 			tmp.Append("SELECT * FROM [");
 | |
| 			tmp.Append(strDBTable);
 | |
| 			tmp.Append("]");
 | |
| 			return tmp.ToString();
 | |
| 		}
 | |
| 
 | |
| 		// return and set the SELECT statement used to get a DataSet (DB_Data)
 | |
| 		public string SelectCmd
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				return strSelectCommand;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				strSelectCommand = value.ToString();
 | |
| 			}
 | |
| 			
 | |
| 		}
 | |
| 
 | |
| 		public System.Data.DataSet DB_Data 
 | |
| 		{
 | |
| 			// return a DataSet containing the database (table) records
 | |
| 			get
 | |
| 			{
 | |
| 				dbConn.Open();
 | |
| 				// if a select command was not created, then use the default
 | |
| 				// select all command
 | |
| 				if (strSelectCommand == null || strSelectCommand.Equals(""))
 | |
| 					strSelectCommand = DefaultSelectCommand();
 | |
| 
 | |
| 				OleDbDataAdapter da =new OleDbDataAdapter(strSelectCommand,dbConn);
 | |
| 				DataSet ds = new DataSet();
 | |
| 				try 
 | |
| 				{
 | |
| 					da.Fill(ds);
 | |
| 				}
 | |
| 				catch (Exception err)
 | |
| 				{
 | |
| 					MessageBox.Show(err.Message.ToString(),"VDB Error");
 | |
| 					ds = null; // return null if error getting dataset
 | |
| 				}
 | |
| 				dbConn.Close();
 | |
| 				return ds;
 | |
| 			}
 | |
| 
 | |
| 			// update the database (table) with the changes made to the DataSet
 | |
| 			set
 | |
| 			{
 | |
| 				// pass in a dataset, update the changed/added/deleted records
 | |
| 				int err = 0;
 | |
| 				StringCollection CommandList = new StringCollection();
 | |
| 				// Open a database connection
 | |
| 				dbConn.Open();
 | |
| 
 | |
| 				// Setup for a series of database transactions
 | |
| 				System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 				System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| //				dbTransAct = dbConn.BeginTransaction(IsolationLevel.Serializable);
 | |
| 				dbTransAct = dbConn.BeginTransaction();
 | |
| 				cmdSQL.Connection = dbConn;
 | |
| 				cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 				// Get only the new, modified, and deleted dataset rows
 | |
| 				DataSet dsChanges = value.GetChanges();
 | |
| 
 | |
| 				// Get the database Table (the database file in dBase terms)
 | |
| 				DataTable tbl = dsChanges.Tables[0];
 | |
| 
 | |
| 				// Spin through the changed rows (in the DataSet) and add
 | |
| 				// the proper SQL command to the list of commands
 | |
| 				foreach (DataRow row in tbl.Rows)
 | |
| 				{
 | |
| 					switch (row.RowState)
 | |
| 					{
 | |
| 						case DataRowState.Modified:
 | |
| 							CommandList.Add(GetRecUpdateStr(tbl,row));
 | |
| 							break;
 | |
| 
 | |
| 						case DataRowState.Added:
 | |
| 							CommandList.Add(GetRecInsertStr(tbl,row));
 | |
| 							break;
 | |
| 
 | |
| 						case DataRowState.Deleted:
 | |
| 							CommandList.Add(RecDeleteStr(tbl,row));
 | |
| 							break;
 | |
| 
 | |
| 						default:
 | |
| 							// Ignore the DataRowState.Detached
 | |
| 							// and the DataRowState.Unchanged
 | |
| 							break;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// Process the list of SQL commands
 | |
| 				err = ProcessSQLCommands(cmdSQL,CommandList);
 | |
| 
 | |
| 				// If no errors in the database transactions,
 | |
| 				// commit the changes in both the database
 | |
| 				// and the dataset.
 | |
| 				if (err == 0)
 | |
| 				{
 | |
| 					dbTransAct.Commit();
 | |
| 					value.AcceptChanges();
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					// If there was an error then roll back the changes
 | |
| 					dbTransAct.Rollback();
 | |
| 				}
 | |
| 				dbConn.Close();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public bool ProcessACommand(string cmd)
 | |
| 		{
 | |
| 			// open a connection and setup for the database command
 | |
| 			dbConn.Open();
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;	
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			try 
 | |
| 			{
 | |
| 				cmdSQL.Connection = dbConn;
 | |
| 				cmdSQL.Transaction = dbTransAct;
 | |
| 				cmdSQL.CommandText = cmd;
 | |
| 				cmdSQL.ExecuteNonQuery();
 | |
| 				dbTransAct.Commit();
 | |
| 				dbConn.Close();
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				dbTransAct.Rollback();
 | |
| 				dbConn.Close();
 | |
| 				MessageBox.Show(e.Message,"Error writing to database");
 | |
| 				return false;
 | |
| 			}
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		// Create a function that returns an SQL statement to use for updating
 | |
| 		// existing records in a database
 | |
| 		public abstract string GetRecUpdateStr(DataTable tbl,DataRow row);
 | |
| 
 | |
| 		// Create a function that returns an SQL statement to use for inserting
 | |
| 		// records in a database
 | |
| 		public abstract string GetRecInsertStr(DataTable tbl,DataRow row);
 | |
| 
 | |
| 		// Create a function that returns an SQL statement to use for deleting
 | |
| 		// existing records in a database
 | |
| 		public abstract string RecDeleteStr(DataTable tbl,DataRow row);
 | |
| 
 | |
| 		// Create a function that returns a list of SQL commands that will create 
 | |
| 		// a new table
 | |
| 		public abstract StringCollection CreateTableStatements(string strTblName);
 | |
| 
 | |
| 		// Create a function that returns a list of SQL commands that selects from 
 | |
| 		// given table into another table. (Used for copying to approved/tmpchg).
 | |
| 		public virtual StringCollection SelectIntoStatements(string destdb){return null;}
 | |
| 
 | |
| 		// Create a function that returns a list of SQL commands that will create
 | |
| 		// the index files needed for this database file.
 | |
| 		public virtual StringCollection CreateIndexFilesStatements(){return null;}
 | |
| 		
 | |
| 		// Create a function that returns a list of SQL commands that will create
 | |
| 		// the first (empty) record.
 | |
| 		public virtual StringCollection CreateFirstRecordStatement(string strTblName)
 | |
| 		{
 | |
| 			StringCollection rtnStrColl = new StringCollection();
 | |
| 			// Default to no "first record" (a.k.a record zero)
 | |
| 			// Return an empty set of SQL commands
 | |
| 			return rtnStrColl;
 | |
| 		}
 | |
| 
 | |
| 		// Override this function if post processing is needed after creating
 | |
| 		// a table.
 | |
| 		public virtual int PostCreateTableFunction()
 | |
| 		{
 | |
| 			return 0;
 | |
| 		}
 | |
| 
 | |
| 		public int CreateTable(string strTlbName)
 | |
| 		{
 | |
| 			int errs =0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			// Setup for a series of database transactions
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| //			dbTransAct = dbConn.BeginTransaction(IsolationLevel.Serializable);
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// Process the list of SQL commands
 | |
| 			// NOTE: if you create an associated INF file (for dBase indexes)
 | |
| 			//       before calling ProcessSQLCommands(), the INF file will be
 | |
| 			//       deleted (by the database engine) when the Create Table
 | |
| 			//       SQL command is run.
 | |
| 			errs = ProcessSQLCommands(cmdSQL,CreateTableStatements(strTlbName));
 | |
| 
 | |
| 			// The PostCreateTableFunction() function should:
 | |
| 			// - call CreateINF()if using dBase files with indexes
 | |
| 			// - create the first "blank" record if required
 | |
| 			if (errs == 0)
 | |
| 				errs = PostCreateTableFunction();
 | |
| 			// Create the first record
 | |
| 			if (errs == 0)
 | |
| 				errs = ProcessSQLCommands(cmdSQL,CreateFirstRecordStatement(strTlbName));
 | |
| 
 | |
| 			dbConn.Close();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		// Just a pass through, update string is passed in.
 | |
| 		public bool UpdateUsing(string updstr)
 | |
| 		{
 | |
| 			return (ProcessACommand(updstr));
 | |
| 		}
 | |
| 
 | |
| 		// Select data from the current table into a new table, where the new table
 | |
| 		// is the parameter destfile which includes the pathname to the database
 | |
| 		// file.
 | |
| 		public int SelectIntoNewTable(string destfile)
 | |
| 		{
 | |
| 			int errs=0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			// Setup for a series of database transactions
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// Process the list of SQL commands, selectinto has no where clause.
 | |
| 			// It only requires that the destination database file be included.
 | |
| 			errs = ProcessSQLCommands(cmdSQL,SelectIntoStatements(destfile));
 | |
| 
 | |
| 			dbConn.Close();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		// make statement to insert into (an existing table). If table specific
 | |
| 		// commands are needed, move this to the specific table code.
 | |
| 		public StringCollection InsertIntoStatements(string destdb, string WhereStr)
 | |
| 		{
 | |
| 			StringCollection rtnStrColl = new StringCollection();
 | |
| 			StringBuilder str = new StringBuilder();
 | |
| 			
 | |
| 			str.Append("INSERT INTO ");
 | |
| 			str.Append(DBTable);
 | |
| 			str.Append(" IN '");
 | |
| 			str.Append(destdb.Substring(0,destdb.LastIndexOf('\\')));
 | |
| 			str.Append("' 'dBase III;' SELECT * FROM ");
 | |
| 			str.Append(DBTable);
 | |
| 			
 | |
| 			if (WhereStr.Length > 0) // Was a WHERE clause passed in?
 | |
| 			{
 | |
| 				// Add " WHERE " to the beginning if it is not already there
 | |
| 				string tmpstr = WhereStr.ToUpper();
 | |
| 				if (tmpstr[0] != ' ')
 | |
| 				{
 | |
| 					str.Append(" ");
 | |
| 					if (!tmpstr.StartsWith("WHERE "))
 | |
| 						str.Append("WHERE ");
 | |
| 				}
 | |
| 				else if (!tmpstr.StartsWith(" WHERE "))
 | |
| 					str.Append(" WHERE");
 | |
| 				// add the passed in WHERE clause
 | |
| 				str.Append(WhereStr);
 | |
| 			}
 | |
| 			rtnStrColl.Add(str.ToString());
 | |
| 			return rtnStrColl;
 | |
| 		}
 | |
| 
 | |
| 		public int InsertInto(string destfile, string WhereStr)
 | |
| 		{
 | |
| 			int errs=0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			// Setup for a series of database transactions
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// Process the list of SQL commands, selectinto has no where clause, but
 | |
| 			// requires that the index file be created ("",true arguments)
 | |
| 			errs = ProcessSQLCommands(cmdSQL,InsertIntoStatements(destfile,WhereStr));
 | |
| 			dbConn.Close();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		// make statement to delete records based on input criteria. If table specific
 | |
| 		// commands are needed, move this to the specific table code.
 | |
| 		public StringCollection DeleteSelectedStr(string whereclause)
 | |
| 		{
 | |
| 			StringCollection rtnStrColl = new StringCollection();
 | |
| 			StringBuilder deleteStr = new StringBuilder();
 | |
| 			deleteStr.Append("DELETE FROM [");
 | |
| 			deleteStr.Append(DBTable);
 | |
| 			deleteStr.Append("]");
 | |
| 	
 | |
| 			// Add the WHERE clause
 | |
| 			deleteStr.Append(" WHERE ");
 | |
| 			deleteStr.Append(whereclause);
 | |
| 			rtnStrColl.Add(deleteStr.ToString());
 | |
| 			return rtnStrColl;
 | |
| 		}
 | |
| 
 | |
| 		// Delete selected records based on criteria from WhereStr parameter.
 | |
| 		public int DeleteSelected(string WhereStr)
 | |
| 		{
 | |
| 			int errs=0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// Process the list of SQL commands
 | |
| 			errs = ProcessSQLCommands(cmdSQL,DeleteSelectedStr(WhereStr));
 | |
| 
 | |
| 			dbConn.Close();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		public abstract StringCollection DeleteTableStatements(string strTblName);
 | |
| 
 | |
| 		// Override this function if post processing is needed after removing
 | |
| 		// a table.
 | |
| 		public int PostDeleteTableFunction()
 | |
| 		{
 | |
| 			return 0;
 | |
| 		}
 | |
| 
 | |
| 		public virtual int DeleteTable(string strTblName)
 | |
| 		{
 | |
| 			int errs =0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			// Setup for a series of database transactions
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| //			dbTransAct = dbConn.BeginTransaction(IsolationLevel.Serializable);
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// Process the list of SQL commands
 | |
| 			errs = ProcessSQLCommands(cmdSQL,DeleteTableStatements(strTblName));
 | |
| 
 | |
| 			// do any needed post processing
 | |
| 			if (errs == 0) 
 | |
| 				errs = PostDeleteTableFunction();
 | |
| 
 | |
| 			if (errs == 0) // no errors
 | |
| 			{
 | |
| 				strDBTable = "";
 | |
| 				if (databaseTypeValue.Equals(vdb_DBConnType.DBTypes.DBaseIII))
 | |
| 				{
 | |
| 					strDBFile = "";
 | |
| 				}
 | |
| 			}
 | |
| 			dbConn.Close();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		// Override this function to create a text file with the same name as the
 | |
| 		// dBase file, except give it an extension of INF instead of DBF.
 | |
| 		// Inside this text file should be the index file names associated
 | |
| 		// with the dBasefile. (each file name should be on its own line)
 | |
| 		// Example, for USAGERO.DBF you should create a USAGERO.INF and inside
 | |
| 		// the INF file should be:
 | |
| 		//                         NDX1=USAGERO.NDX
 | |
| 		//                         NDX2=USAGROID.NDX
 | |
| 		//
 | |
| 		// If the dBase does not use an index file, then there is no need to
 | |
| 		// override this virtual funtion.
 | |
| 		public virtual int CreateINF()
 | |
| 		{
 | |
| 			return 0;
 | |
| 		}
 | |
| 
 | |
| 		public bool isdBaseFile()
 | |
| 		{
 | |
| 			return databaseTypeValue == (int)vdb_DBConnType.DBTypes.DBaseIII;
 | |
| 		}
 | |
| 		public virtual string GetCreateIndx1String()
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		public virtual string GetCreateIndx2String()
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
| 		public virtual bool IndexFilesExist()
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public virtual void DeleteIndexFiles()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		// use this to clean up/create index & INF Files.  The INF files are used to
 | |
| 		// define which index files are used for the given database file. However, if file
 | |
| 		// names are listed in the INF file and the NDX file does not exist, an error was
 | |
| 		// given - so be sure that the index files exist too. Note that the INF file 
 | |
| 		// must be created after the NDX file, because an error occurs if creating an NDX
 | |
| 		// file when an INF file exists. This was done to fix B2005-030. 
 | |
| 		public bool CheckIndxAndINF()
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				if (!IndexFilesExist())
 | |
| 				{
 | |
| 					string cwd = Directory.GetCurrentDirectory();
 | |
| 					Directory.SetCurrentDirectory(DBPath);
 | |
| 					// if more than one index file exists for a dbf, then delete (in case
 | |
| 					// one of them did exist)
 | |
| 					DeleteIndexFiles();
 | |
| 					// CreateIndexFiles creates the NDX and also INF.
 | |
| 					CreateIndexFiles();
 | |
| 					Directory.SetCurrentDirectory(cwd);
 | |
| 				}
 | |
| 				else
 | |
| 					CreateINF();	// CreateINF creates a new copy (overwrites any existing)
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show("Could not set up index files " +  e.Message,"Check For Indexes");
 | |
| 				return false;
 | |
| 			}
 | |
| 			return true;
 | |
| 		}
 | |
| 			
 | |
| 		public virtual int CreateIndexFiles()
 | |
| 		{
 | |
| 			int errs =0;
 | |
| 			dbConn.Open();
 | |
| 
 | |
| 			// Setup for a series of database transactions
 | |
| 			System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand();
 | |
| 			System.Data.OleDb.OleDbTransaction dbTransAct;
 | |
| 			dbTransAct = dbConn.BeginTransaction();
 | |
| 			cmdSQL.Connection = dbConn;
 | |
| 			cmdSQL.Transaction = dbTransAct;
 | |
| 
 | |
| 			// if dbase, delete the inf file. If it exists, an error occurs when 
 | |
| 			// creating the index.
 | |
| 			if (File.Exists(strDBTable+".INF")) File.Delete(strDBTable+".INF");
 | |
| 			// Process the list of SQL commands
 | |
| 			errs = ProcessSQLCommands(cmdSQL,CreateIndexFilesStatements());
 | |
| 			dbConn.Close();
 | |
| 			if (errs==0 && isdBaseFile()) CreateINF();
 | |
| 			return errs;
 | |
| 		}
 | |
| 
 | |
| 		public void Pack()
 | |
| 		{
 | |
| 			// the database was not getting 'packed' on a delete, i.e. the deleted
 | |
| 			// records were still visible in the 16-bit codes. We'll pack here by
 | |
| 			// selecting into a temp db & renaming files. 
 | |
| 
 | |
| 			// first see if there is an index, i.e. GetCreateIndxString will return
 | |
| 			// a string if an index file is needed. If so, we know that we'll have
 | |
| 			// to create the index(es) & also create an INF file.
 | |
| 			string createindx = GetCreateIndx1String();
 | |
| 
 | |
| 			string origname = this.DBTable;
 | |
| 			string newtbname=null;
 | |
| 			try
 | |
| 			{
 | |
| 				if (this.DBTable.Length==8)
 | |
| 					newtbname = "z" + this.DBTable.Substring(1,7);
 | |
| 				else
 | |
| 					newtbname = "z" + this.DBTable;				
 | |
| 
 | |
| 				string sqlcmd = "select * into [" + newtbname + "] from [" + origname + "];";
 | |
| 
 | |
| 				// Setup for a series of database transactions
 | |
| 				dbConn = new OleDbConnection(databaseType.ConnectionString(strDBPath,""));
 | |
| 				dbConn.Open();
 | |
| 				System.Data.OleDb.OleDbCommand cmdSQL = new OleDbCommand(sqlcmd,dbConn);
 | |
| 				cmdSQL.ExecuteNonQuery();
 | |
| 				dbConn.Close();
 | |
| 
 | |
| 				// delete original & rename   (dbf, dbt), then make new index file & INF
 | |
| 				// file, if they exist.
 | |
| 				foreach(string str in DBExtensions)
 | |
| 				{
 | |
| 					string orig = strDBPath+"\\"+origname + "." + str;
 | |
| 					if (File.Exists(orig))
 | |
| 					{
 | |
| 						File.Delete(orig);
 | |
| 						string newnm = strDBPath + "\\" + newtbname + "." + str;
 | |
| 						File.Move(newnm,orig);
 | |
| 					}
 | |
| 				}
 | |
| 				if (createindx!=null)
 | |
| 				{
 | |
| 					// delete the index files...
 | |
| 					DeleteIndexFiles();
 | |
| 					dbConn.Open();
 | |
| 					cmdSQL = new OleDbCommand(createindx,dbConn);
 | |
| 					cmdSQL.ExecuteNonQuery();
 | |
| 					createindx = GetCreateIndx2String();
 | |
| 					if (createindx!=null)
 | |
| 					{
 | |
| 						cmdSQL.CommandText = createindx;
 | |
| 						cmdSQL.ExecuteNonQuery();
 | |
| 					}
 | |
| 					dbConn.Close();
 | |
| 					CreateINF();
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception e)
 | |
| 			{
 | |
| 				MessageBox.Show(e.Message,"Could not pack database, use data integrity checker on procedure");
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |