Click here to Skip to main content
15,880,956 members
Articles / Desktop Programming / Windows Forms

Working C# code for MySql Stored Procedures IN, OUT, and INOUT parameters

Rate me:
Please Sign up or sign in to vote.
4.29/5 (10 votes)
15 May 2009CPOL9 min read 178.7K   3.5K   42  
An article on how to get parameters into and out of MySql stored procedures.
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>BinaryLib</name>
    </assembly>
    <members>
        <member name="T:BinaryLib.SqlReader">
            <summary>
            Provides an interface for executing Sql Queries and NonQueries.
            This is for MS SQL databases
            </summary>
        </member>
        <member name="M:BinaryLib.SqlReader.Create(System.String,System.String)">
            <summary>
            Creates a SqlReader object with CommandType of Text
            </summary>
            <param name="connectionString">The connection string to use to connect to the server.</param>
            <param name="commandText">The text to execute on the SQL server.</param>
        </member>
        <member name="M:BinaryLib.SqlReader.#ctor(System.String,System.String,System.Data.CommandType)">
            <summary>
            Creates a SqlReader object.
            </summary>
            <param name="connectionString">The connection string to use to connect to the server.</param>
            <param name="commandText">The text to execute on the SQL server.</param>
            <param name="commandType">The command type of the command to perform.</param>
        </member>
        <member name="M:BinaryLib.SqlReader.Execute">
            <summary>
            Executes a query.
            </summary>
        </member>
        <member name="M:BinaryLib.SqlReader.ExecuteNonQuery">
            <summary>
            Executes a non-query.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlReader.ConnectionString">
            <summary>
            The connection string of the SqlReader object.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlReader.CommandText">
            <summary>
            The command text of the SqlReader object.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlReader.ReturnData">
            <summary>
            Indicates whether or not the SqlCommand returns data or not.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlReader.Parameters">
            <summary>
            An object representing the parameters to use while executing a query.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlReader.Result">
            <summary>
            An object returning the result of a Sql Query.
            </summary>
        </member>
        <member name="M:BinaryLib.SqlData.GetColumnName(System.Int32)">
            <summary>
            Returns the name of the specified column.
            </summary>
            <param name="column">The 0-based integer value representing the column number.</param>
            <returns>A column name in string format.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetColumnNames">
            <summary>
            Returns a list of type string containing all the column names returned in the query.
            </summary>
            <returns>A list of type string.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValueList(System.Int32)">
            <summary>
            Returns a list of type object filled with values from the specified column.
            </summary>
            <param name="column">The 1-based column identifier.</param>
            <returns>A list of type object</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValueList(System.String)">
            <summary>
            Returns a list of type object filled with values from the specified column.
            </summary>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>A list of type object</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValue(System.Int32,System.Int32)">
            <summary>
            Returns an object representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type object.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValue(System.Int32)">
            <summary>
            Returns an object representing the value of the item from the Sql Query
            </summary>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type object.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValue(System.String)">
            <summary>
            Returns an object representing the value of the item from the Sql Query
            </summary>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type object.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetValue(System.Int32,System.String)">
            <summary>
            Returns an object representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type object.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.IsNull(System.Int32)">
            <summary>
            Returns true if the database value is null.
            </summary>
            <param name="column">The 0-based column identifier.</param>
            <returns>True if null, False if not null.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.IsNull(System.Int32,System.Int32)">
            <summary>
            Returns true if the database value is null.
            </summary>
            <param name="row">The 1-based column identifier.</param>
            <param name="column">The 0-based column identifier.</param>
            <returns>True if null, False if not null.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.IsNull(System.String)">
            <summary>
            Returns true if the database value is null.
            </summary>
            <param name="columnName">The name of the column.</param>
            <returns>True if null, False if not null.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.IsNull(System.Int32,System.String)">
            <summary>
            Returns true if the database value is null.
            </summary>
            <param name="row">The 1-based column identifier.</param>
            <param name="columnName">The name of the column.</param>
            <returns>True if null, False if not null.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetString(System.Int32)">
            <summary>
            Returns a string value representing the value of the item from the Sql Query.
            </summary>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type string.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetString(System.Int32,System.Int32)">
            <summary>
            Returns a string value representing the value of the item from the Sql Query.
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type string.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetString(System.String)">
            <summary>
            Returns a string value representing the value of the item from the Sql Query.
            </summary>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type string.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetString(System.Int32,System.String)">
            <summary>
            Returns a string value representing the value of the item from the Sql Query.
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type string.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt32(System.Int32)">
            <summary>
            Returns an Int32 value representing the value of the item from the Sql Query
            </summary>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type Int32.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt32(System.Int32,System.Int32)">
            <summary>
            Returns an Int32 value representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type Int32.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt32(System.String)">
            <summary>
            Returns an Int32 value representing the value of the item from the Sql Query
            </summary>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type Int32.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt32(System.Int32,System.String)">
            <summary>
            Returns an Int32 value representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type Int32.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt64(System.Int32)">
            <summary>
            Returns an Int64 value representing the value of the item from the Sql Query
            </summary>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type Int64.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt64(System.Int32,System.Int32)">
            <summary>
            Returns an Int64 value representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="column">The 0-based column identifier.</param>
            <returns>Value of type Int64.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt64(System.String)">
            <summary>
            Returns an Int64 value representing the value of the item from the Sql Query
            </summary>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type Int64.</returns>
        </member>
        <member name="M:BinaryLib.SqlData.GetInt64(System.Int32,System.String)">
            <summary>
            Returns an Int64 value representing the value of the item from the Sql Query
            </summary>
            <param name="row">The 1-based row identifier.</param>
            <param name="columnName">The column name from which to pull the data.</param>
            <returns>Value of type Int64.</returns>
        </member>
        <member name="P:BinaryLib.SqlData.RowCount">
            <summary>
            Gets the number of rows in the result query.
            </summary>
        </member>
        <member name="P:BinaryLib.SqlData.ColumnCount">
            <summary>
            Gets the number of columns in the result query.
            </summary>
        </member>
        <member name="T:BinaryLib.clsMySqlAccess">
            <summary>
            clsMySqlAccess - class for accessing MySql databases.
            Construct with a login string or clsMySqlLogin class.
            Uses the dataProvider.
            There should be one of these for each connection.
            It is used to access all tables in a given database.
            </summary>
        </member>
        <member name="F:BinaryLib.clsMySqlAccess._login">
            <summary>
            holds connection string for this accessor
            </summary>
        </member>
        <member name="F:BinaryLib.clsMySqlAccess.DbType">
            <summary>
            This class is specifically for MYSQL databases
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.Dispose">
            <summary>
            clean up this object
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.Finalize">
            <summary>
            Destructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.#ctor">
            <summary>
            clsMySqlAccess() - disallow empty constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.#ctor(BinaryLib.clsMySqlLogin)">
            <summary>
            clsMySqlAccess(clsMySqlLogin signon) - Construct with a login class
            </summary>
            <param name="signon">Prebuilt clsMySqlLogin class</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.#ctor(System.String)">
            <summary>
            clsMySqlAccess(connectString)- construct a login class
            </summary>
            <param name="connectString">complete connection string</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.#ctor(System.String,System.String)">
            <summary>
            clsMySqlAccess(user,password) - construct a default ppt connect string
            </summary>
            <param name="usr"></param>
            <param name="pwd"></param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.QueryDS(System.Data.DataSet,System.String)">
            <summary>
            QueryDS - Native mode query to fill a DATA SET
            </summary>
            <param name="dataset">DataSet to be filled</param>
            <param name="sql">sql to retrieve data</param>
            <returns>filled in dataset</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.QueryDS(System.String)">
            <summary>
            QueryDS - run a query and return a dataset
            Simple way to gat a dataset from sql
            Uses DataProvidor
            </summary>
            <param name="sql">sql to retrieve data</param>
            <returns>filled dataset</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.QueryDsForList(System.Data.DataSet,System.String)">
            <summary>
             Extract a list of strings  from a dataset for a list
            </summary>
            <param name="ds">Dataset with input</param>
            <param name="columnName">Column name to extract</param>
            <returns>list of strings containing the data or null</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.Reset(System.String)">
            <summary>
            Reset - Resets the connection string to a new one
            </summary>
            <param name="connectString"></param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.Scalar(System.String)">
            <summary>
            Scalar - Get a single result from the database
            </summary>
            <param name="sql">command to execute</param>
            <returns>Object with value must cast this</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.Scalar(System.String,System.String[])">
            <summary>
            Scalar - for insert, delete, and updates
            NOT bound in a transaction so it is not safe
            There is a variable number of parameters that are entered in pairs of strings.
            such as "?name","John","?Age","25"...
            </summary>
            <param name="sql">SQL to execute with embeded parameters. As many as needed </param>
            <param name="items">Name of embeded parameter followed by value )</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.NativeProc(MySql.Data.MySqlClient.MySqlCommand)">
            <summary>
            execute a native Mysql non query using a prebuilt
            MySqlCommand object.
            Eventually this will execute stored procedures
            </summary>
            <param name="cmd">pre built command object</param>
            <returns>UInt32 number of rows effected</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.NativeExec(System.String)">
            <summary>
            Execute using native Mysql mode
            </summary>
            <param name="sql">sql to execute</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.NonQuery(System.String)">
            <summary>
            NonQuery - for insert, delete, and updates
            NOT bound in a transaction so it is not safe
            </summary>
            <param name="sql">SQL to execute</param>
            <returns>Int64 with number of rows effected</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.NonQuery(System.String,System.String,System.String)">
            <summary>
            NonQuery - for insert, delete, and updates
            NOT bound in a transaction so it is not safe
            </summary>
            <param name="sql">SQL to execute with embeded parameter (one)</param>
            <param name="replace">Name of embeded parameter (one)</param>
            <param name="parm">Value for embeded parameter (one)</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.NonQuery(System.String,System.String[])">
            <summary>
            NonQuery - for insert, delete, and updates
            NOT bound in a transaction so it is not safe
            There is a variable number of parameters that are entered in pairs of strings.
            such as "?name","John","?Age","25"...
            </summary>
            <param name="sql">SQL to execute with embeded parameters. As many as needed </param>
            <param name="items">Name of embeded parameter followed by value )</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.QueryClassList(System.String,System.Object)">
            <summary>
            Get an ArrayList of all objects selected.
            </summary>
            <param name="sql">SQL to execute</param>
            <param name="obj">new class of the type desired for the return array</param>
            <returns>ArrayList of objects. can be cast to desired object</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.QueryClass(System.String,System.Object)">
            <summary>
            QueryClass - get one item of specified class
            </summary>
            <param name="sql">select for one item</param>
            <param name="obj">new anyObject to provide type data</param>
            <returns>object of the requested type</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.runTransactions(System.String[])">
            <summary>
            runTransactions - execute multiple sql statements with a transaction
            This should be followed by a commit or rollback
            HAS  BEEN TESTED
            </summary>
            <param name="sqla">An array of sql commands insert/update/delete</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.runTransactions(MySql.Data.MySqlClient.MySqlConnection,MySql.Data.MySqlClient.MySqlCommand[])">
            <summary>
            runTransactions - native mode transactions
            </summary>
            <param name="conn">MYSQL connection</param>
            <param name="cmds">array of mysql commands</param>
            <returns>OK if sucessful. else error message</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.runTransactions(BinaryLib.DataProvider.Command[])">
            <summary>
            runTransactions - native mode transactions
            </summary>
            <param name="cmds">array of DataProvider commands</param>
            <returns>OK if sucessful. else error message</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.GetCommandArray(MySql.Data.MySqlClient.MySqlConnection,System.String[])">
            <summary>
            GetCommandArray - gets a MYSQL command structure array
            from a list of sql statements in native mode
            </summary>
            <param name="connection">the Mysql connection</param>
            <param name="sql">array of sql statements</param>
            <returns>Array of MySqlCommand objects</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.AddParm(System.String,System.String,MySql.Data.MySqlClient.MySqlCommand@)">
            <summary>
            AddParm - adds parameters for substitution is sql commands
            The input MySqlCommand is modified
            </summary>
            <param name="name">Name of parameter ?name</param>
            <param name="val">The replacement value</param>
            <param name="cmd">The command structure to be changed</param>
        </member>
        <member name="M:BinaryLib.clsMySqlAccess.GetConnection">
            <summary>
            GetConnection - Get a MYSQL connection
            </summary>
            <returns></returns>
        </member>
        <member name="T:BinaryLib.clsMP3v2Tag">
            <summary>
            clsMP3v2Tag - read v2 tags from the file
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.#ctor">
            <summary>
            Empty copy of class
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.#ctor(System.IO.FileStream@,System.Int32,System.Int32)">
            <summary>
            new class ctor - most usefull
            </summary>
            <param name="fs">FileStream for the file</param>
            <param name="lbl">size of each tag label</param>
            <param name="flg">size of the tag flag bytes</param>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.setFile(System.IO.FileStream@,System.Int32,System.Int32)">
            <summary>
            assign the filestream to use
            </summary>
            <param name="fs">FileStream for the file</param>
            <param name="lbl">size of each tag label</param>
            <param name="flg">size of the tag flag bytes</param>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.getTag">
            <summary>
            Get the next tag from the stream
            </summary>
            <returns>file position for the next read</returns>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.decipher">
            <summary>
            Decipher the tag if necessary
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.decodeFrame">
            <summary>
            Decode the tag
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.doimage">
            <summary>
            Handle embedded images
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.saveImage(System.String)">
            <summary>
            Save the embedded image in an external file
            </summary>
            <param name="path">where to store the image complete file name and path</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.decodedLength">
            <summary>
            Get length of decoded section
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.decodeGenres">
            <summary>
            Translate 2 digit genres to string names
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.sliceGenre">
            <summary>
            further decode genre
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.syncSafeLength(System.Byte[])">
            <summary>
            syncSafeLength 28 bit length in 4 bytes
            Each high order bit is zero so
            0x7f 0x7f 0x7f 0x7f translates to
            0x0f 0xff 0xff 0xff
            </summary>
            <param name="bfr">raw sata</param>
            <returns>sync lenght</returns>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.cvtLen(System.Byte[])">
            <summary>
            cvtLen normal big endian length for all else
            converts 4 bytes
            </summary>
            <param name="bfr">raw data</param>
            <returns>length</returns>
        </member>
        <member name="M:BinaryLib.clsMP3v2Tag.xlate(System.Byte[])">
            <summary>
            make sure of ascii encoding
            </summary>
            <param name="raw"></param>
            <returns></returns>
        </member>
        <member name="T:BinaryLib.clsRawBase">
            <summary>
            clsRawBase - base class to access MYSQL database
            This uses native mode MYSQL classes and is one way to obtain a long
            term connection to the database.
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.constr">
            <summary>
            Connection string.
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.host">
            <summary>
            host or server name.
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.user">
            <summary>
            database user name
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.pwd">
            <summary>
            user password
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.dbname">
            <summary>
            database to use
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.tblname">
            <summary>
            current table name
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.csrsql">
            <summary>
            sql to run a cursor on the data
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.current">
            <summary>
            current row for cursor
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.startRow">
            <summary>
            start row for cursor read
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.endRow">
            <summary>
            end row for cursor read
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.maxRow">
            <summary>
            max rows for one cursor read
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.conn">
            <summary>
            Native MYSQL connection class
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.csrConn">
            <summary>
            Native MYSQL connection for cursor
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.lconn">
            <summary>
            long term connection
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.data">
            <summary>
            Native data table class
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.ds">
            <summary>
            a raw dataset
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.da">
            <summary>
            Native MYSQL data adapyer
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawBase.cb">
            <summary>
            Native MYSQL command builder
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.#ctor">
            <summary>
            empty constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.getTable">
            <summary>
            Get the first table
            </summary>
            <returns>DataTable class for first table</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.fetchRow">
            <summary>
            Issue next cursor fetch
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.openCursor(System.String,System.String)">
            <summary>
            Open a cursor
            Throws Exception for error
            </summary>
            <param name="sql">sql to issue</param>
            <param name="tbl">Table to read</param>
            <returns>true for success</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.closeCursor">
            <summary>
            Close the active cursor
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.fetch">
            <summary>
            Issue next fetch starting a current + 1
            This is for one row at a time
            </summary>
            <returns>The next row as a DataRow class</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.getFirst">
            <summary>
            getFirst gets first record in dataset
            For use with load
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.getNext">
            <summary>
            getNext gets next row 
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.getList(System.String)">
            <summary>
            getList gets a list of strings from the specified column
            Presumes the dataset has been filled.
            </summary>
            <param name="colName">Name of column to extract</param>
            <returns>List of strings from the specified column</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.updateRow(System.Data.DataRow)">
            <summary>
            updateRow updates current row used with fetch, and get functions
            </summary>
            <param name="ro">row to be updated</param>
        </member>
        <member name="M:BinaryLib.clsRawBase.getNewRow">
            <summary>
            getNewRow get a new table row
            Used to add rows to the table
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.insertRow(System.Data.DataRow)">
            <summary>
            insertRow adds a row to the table use getNewRow row
            </summary>
            <param name="ro">DataRow to be inserted</param>
        </member>
        <member name="M:BinaryLib.clsRawBase.selectItem(System.String)">
            <summary>
            selectItem reads single row from table
            does not change current dataset
            </summary>
            <param name="sql">SQL for single row select</param>
            <returns>DataRow for requested item</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.lselectItem(System.String)">
            <summary>
            Select a row from the long term connection
            </summary>
            <param name="sql">sql to issue</param>
            <returns>DataRow for the selected item</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.selectMulti(System.String)">
            <summary>
            Get a DataTable class containing multiple rows
            </summary>
            <param name="sql">sql to issue</param>
            <returns>DataTable of result or null for error</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.execNonQuery(System.String)">
            <summary>
            execNonQuery used for inserts and updates
            does not affect current dataset
            </summary>
            <param name="sql">Insert,delete or update SQL</param>
            <returns>Count of rows changed</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.lexecNonQuery(System.String)">
            <summary>
            execute sql using long term connection
            </summary>
            <param name="sql">sql to issue</param>
            <returns>number of rows changed</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.mkConStr(System.String,System.String,System.String,System.String)">
            <summary>
            build a connection string from parms
            </summary>
            <param name="host">host or server name</param>
            <param name="user">database user name</param>
            <param name="pwd">user password</param>
            <param name="db">database to use</param>
        </member>
        <member name="M:BinaryLib.clsRawBase.genConStr">
            <summary>
            generate the full connection string from the stored values
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.genNoDb">
            <summary>
            generate a connection string without the database parameter
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.changeDatabase(System.String)">
            <summary>
            Change to a specific database.
            This creates a long term connection
            </summary>
            <param name="db">database to use</param>
            <returns>true for sucess else false</returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.doConnect">
            <summary>
            doConnect connection for this class
            Leaves the connection open. This is a short term connection.
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.disconnect">
            <summary>
            disconnect closes the short connection
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.ldoConnect">
            <summary>
            open long term connection
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsRawBase.ldisconnect">
            <summary>
            close long term connection
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawBase.testConnect">
            <summary>
            Test the connection string
            </summary>
            <returns>true for success else false</returns>
        </member>
        <member name="P:BinaryLib.clsRawBase.ConStr">
            <summary>
            Connection string Property
            </summary>
        </member>
        <member name="P:BinaryLib.clsRawBase.Count">
            <summary>
            Get count of rows in first table in the dataset
            </summary>
        </member>
        <member name="T:BinaryLib.DataProvider">
            <summary>
            Provides database-independent access by hiding vendor specific classes
            This code is from code project and written by Jaryl Sim.
            
            Ken Jones added the MYSQL database support.
            </summary>
        </member>
        <member name="M:BinaryLib.DataProvider.#ctor(System.String,BinaryLib.DataProvider.DBType)">
            <summary>
            Constructor
            </summary>
            <param name="connectionstring">DB connection string</param>
            <param name="dbtype">Database type to access</param>
        </member>
        <member name="M:BinaryLib.DataProvider.CreateCommand(System.String)">
            <summary>
            Creates a Command object to manipulate the database
            </summary>
            <param name="sqlstring">DB connection string</param>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteNonQuery(System.String)">
            <summary>
            Executes SQL INSERT, DELETE and UPDATE statements and returns the number of rows affected
            </summary>
            <param name="commandstring">Command string</param>
            <returns>Number of rows affected</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteNonQuery(BinaryLib.DataProvider.Command)">
            <summary>
            Executes SQL INSERT, DELETE and UPDATE statements and returns the number of rows affected
            </summary>
            <param name="command">Command object</param>
            <returns>Number of rows affected</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteReader(System.String)">
            <summary>
            Executes SQL commands and returns a forward-only DataReader
            </summary>
            <param name="commandstring">Command string</param>
            <returns>DataReader containing data</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteReader(BinaryLib.DataProvider.Command)">
            <summary>
            Executes SQL commands and returns a forward-only DataReader
            </summary>
            <param name="command">Command object</param>
            <returns>DataReader containing data</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteScalar(System.String)">
            <summary>
            Executes SQL commands to retrieve a single value from database
            </summary>
            <param name="commandstring">Command string</param>
            <returns>Single object containing result</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteScalar(BinaryLib.DataProvider.Command)">
            <summary>
            Executes SQL commands to retrieve a single value from database
            </summary>
            <param name="command">Command object</param>
            <returns>Single object containing result</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.FillDataSet(System.String)">
            <summary>
            Executes SQL commands to return rows in a DataSet
            </summary>
            <param name="commandstring">Command string</param>
            <returns>Resulting DataSet</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.FillDataSet(BinaryLib.DataProvider.Command)">
            <summary>
            Executes SQL commands to return rows in a DataSet
            </summary>
            <param name="command">Command object</param>
            <returns>Resulting DataSet</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ExecuteTransaction(BinaryLib.DataProvider.Command[])">
            <summary>
            Executes a series SQL INSERT, DELETE and UPDATE statements that ensures atomicity and concurrency. Rolls back on exception.
            </summary>
            <param name="commands">Array of Command objects to be executed in a transaction</param>
        </member>
        <member name="M:BinaryLib.DataProvider.ReflectObject(System.String,System.Type)">
            <summary>
            Populates an object of desired class from the database
            </summary>
            <param name="commandstring">SQL query string</param>
            <param name="objecttype">Type of object expected</param>
            <returns>Reflected object</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ReflectObject(BinaryLib.DataProvider.Command,System.Type)">
            <summary>
            Populates an object of desired class from the database
            </summary>
            <param name="command">Command object</param>
            <param name="objecttype">Type of object expected</param>
            <returns>Reflected object</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ReflectCollection(System.String,System.Type)">
            <summary>
            Populates an arraylist of objects of desired class from the database
            </summary>
            <param name="commandstring">SQL query string</param>
            <param name="objecttype">Type of object expected</param>
            <returns>Reflected objects in a Collection</returns>
        </member>
        <member name="M:BinaryLib.DataProvider.ReflectCollection(BinaryLib.DataProvider.Command,System.Type)">
            <summary>
            Populates an arraylist of objects of desired class from the database
            </summary>
            <param name="command">Command object</param>
            <param name="objecttype">Type of object expected</param>
            <returns>Reflected objects in a Collection</returns>
        </member>
        <member name="P:BinaryLib.DataProvider.DatabaseType">
            <summary>Type of database</summary>
        </member>
        <member name="P:BinaryLib.DataProvider.ConnectionString">
            <summary>Database connection string</summary>
        </member>
        <member name="T:BinaryLib.DataProvider.DBType">
            <summary>
            Types of databases that can be accessed through DataProvider
            </summary>
        </member>
        <member name="F:BinaryLib.DataProvider.DBType.OleDb">
            <summary>OleDb accessible database</summary>
        </member>
        <member name="F:BinaryLib.DataProvider.DBType.SqlServer">
            <summary>SQL accessible database</summary>
        </member>
        <member name="F:BinaryLib.DataProvider.DBType.MySql">
            <summary>MYSQL accessible database</summary>
        </member>
        <member name="T:BinaryLib.DataProvider.Command">
            <summary>
            Types of databases that can be accessed through DataProvider
            Provides database-independent access by hiding vendor specific classes
            This code is from code project and written by Jaryl Sim.
            
            Ken Jones added the MYSQL database support.
            </summary>
        </member>
        <member name="M:BinaryLib.DataProvider.Command.#ctor(System.String)">
            <summary>
            Constructor
            </summary>
        </member>
        <member name="M:BinaryLib.DataProvider.Command.AddParameter(System.String,System.Object)">
            <summary>
            Adds a parameter to the Command
            </summary>
        </member>
        <member name="P:BinaryLib.DataProvider.Command.Parameters">
            <summary>A hashtable containg parameters</summary>
        </member>
        <member name="P:BinaryLib.DataProvider.Command.CommandString">
            <summary>SQL command string</summary>
        </member>
        <member name="P:BinaryLib.DataProvider.Command.Provider">
            <summary>Reference to the DataProvider instance that owns this Command</summary>
        </member>
        <member name="T:BinaryLib.clsMP3Genre">
            <summary>
            clsMp3Genre - array of V 1 genre strings
            V 1 tags use a number for genre and this decodes it
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3Genre.Genre(System.Int32)">
            <summary>
            Genre indexer for integers
            </summary>
            <param name="index"></param>
            <returns>A string name of the Genre</returns>
        </member>
        <member name="M:BinaryLib.clsMP3Genre.Genre(System.String)">
            <summary>
            Genre indexer for strings
            </summary>
            <param name="index"></param>
            <returns>A string name of the Genre</returns>
        </member>
        <member name="M:BinaryLib.clsMP3Genre.getGenre(System.String)">
            <summary>
            find the requested Genre
            </summary>
            <param name="ndx">requested genre as two digit string</param>
            <returns>name of genre</returns>
        </member>
        <member name="P:BinaryLib.clsMP3Genre.Ext">
            <summary>
            Ext returns the genre table
            </summary>
        </member>
        <member name="T:BinaryLib.SqlConnectionString">
            <summary>
            Manages Sql Connection String for MSSQL
            </summary>
        </member>
        <member name="T:BinaryLib.BinStructSize">
            <summary>
            Class to determine the size of a structure one time
            use new BinStructSize(MyStruct);
            This DOES NOT WORK if the struct contains references
            or dynamically constructed elements
            </summary>
        </member>
        <member name="F:BinaryLib.BinStructSize._size">
            <summary>
            _size - internal size of object
            </summary>
        </member>
        <member name="M:BinaryLib.BinStructSize.#ctor(System.Object)">
            <summary>
            BinStructSize - constructor to determine size of given object
            </summary>
            <param name="st">object to determine size of</param>
        </member>
        <member name="P:BinaryLib.BinStructSize.Size">
            <summary>
            Size - read only property to return the size of the structure
            </summary>
        </member>
        <member name="T:BinaryLib.pptGlobal">
            <summary>
            Class to provide access to PPT global variables
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.UserName">
            <summary> PPT User Name</summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.DbUser">
            <summary> Database User name</summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.Password">
            <summary>
            Database password
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.PersonId">
            <summary>
            Unique PPt user id
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.iPhotoFile">
            <summary>
            Path and file name to the users photo
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.userConnect">
            <summary>
            Connection string for this user
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.rootConnect">
            <summary>
            connection string for the root user
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.admin">
            <summary>
            Admin or not
            </summary>
        </member>
        <member name="F:BinaryLib.pptGlobal.Host">
            <summary>
            Server name
            </summary>
        </member>
        <member name="T:BinaryLib.clsRawTags">
            <summary>
            Derived Class to access the tags database.
            This is under construction.
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawTags.#ctor">
            <summary>
            Empty class
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawTags.#ctor(System.String)">
            <summary>
            Derived Connected class
            </summary>
            <param name="s">Connection string</param>
        </member>
        <member name="T:BinaryLib.clsRawMp3Data">
            <summary>
            Derived class to use for a specific Table in the database
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawMp3Data.#ctor">
            <summary>
            Empty constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawMp3Data.#ctor(System.String)">
            <summary>
            Build with connection string
            </summary>
            <param name="s">Connection string</param>
        </member>
        <member name="M:BinaryLib.clsRawMp3Data.#ctor(System.String,System.String,System.String,System.String)">
            <summary>
            Build with individual parms.
            </summary>
            <param name="h"></param>
            <param name="u"></param>
            <param name="p"></param>
            <param name="d"></param>
        </member>
        <member name="T:BinaryLib.clsCollectionTypes">
            <summary>
            clsCollectionTypes - Defines a Type of collection.
            Collection types must be defined to be part of PPT.
            </summary>
        </member>
        <member name="T:BinaryLib.clsAccBase">
            <summary>
            clsAccBase - Base class to provide database Access for the PPT classes
            </summary>
        </member>
        <member name="M:BinaryLib.clsAccBase.Dispose">
            <summary>
            clean up this object
            </summary>
        </member>
        <member name="M:BinaryLib.clsAccBase.Finalize">
            <summary>
            Destructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsAccBase.#ctor">
            <summary>
            ParameterLess constructor is NOT a good idea
            If used it will default to the ppt admin user
            </summary>
        </member>
        <member name="M:BinaryLib.clsAccBase.#ctor(System.String)">
            <summary>
            Build with a connection string.
            </summary>
            <param name="connectionString"></param>
        </member>
        <member name="M:BinaryLib.clsAccBase.AdjPath(System.String)">
            <summary>
            Takes a path and makes it acceptable to mysql
            </summary>
            <param name="pth">external path</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.ExtPath(System.String)">
            <summary>
            Takes a path from the database and makes it usable
            </summary>
            <param name="pth">Path field from the database</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.GetLastInsert">
            <summary>
            Gets the value assigned by auto increment to the last inserted item
            EXCEPTION: If you insert more than one row at a time this returns
            the ID of the FIRST row inserted NOT the LAST.
            </summary>
            <returns>Id of inserted row</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.Insert">
            <summary>
            Use insertion sql as it is given. No parameters need be added.
            Executes Mysql native mode commands
            </summary>
        </member>
        <member name="M:BinaryLib.clsAccBase.Insert(System.String)">
            <summary>
            Specify sql to execute
            This must be of type non query such as insert delete or update
            </summary>
            <param name="sql"></param>
        </member>
        <member name="M:BinaryLib.clsAccBase.Insert(MySql.Data.MySqlClient.MySqlCommand)">
            <summary>
            Insert using a pre built command object
            </summary>
            <param name="obj">MySqlCommand object prebuilt</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.Insert(System.String[])">
            <summary>
            Execute the sqlInsert sql with replacement parameters.
            Repeating pairs of strings like:
            "?name"."Bob","?Age","25"...
            The ? variables are for MYSQL. in MS SQL these would be "@name" or "@Age"
            </summary>
            <param name="items">Repeating pairs of parameter name and value</param>
        </member>
        <member name="M:BinaryLib.clsAccBase.DeleteRow(System.String[])">
            <summary>
            Delete an item from the table
            At least ONE parameter MUST be given and it must match the sql
            set up in the constructor.
            There has to be a unique key given for the item to delete.
            </summary>
            <param name="items">Pairs of strings specifying key and vale for replacement items</param>
            <returns>Number of rows affected</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.UpdateRow">
            <summary>
            Update with no variables - not very practical
            </summary>
            <returns>Count of rows changed</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.UpdateRow(System.String[])">
            <summary>
            Update with params set name = ?name where TypeId = ?id
            </summary>
            <param name="items">key value pairs of strings</param>
            <returns>Count of rows changed</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.QueryDS(System.String)">
            <summary>
            QueryDS - Native mode query to fill a DATA SET
            </summary>
            <param name="sql">sql to retrieve data</param>
            <returns>filled in dataset</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.QueryDsForList(System.Data.DataSet,System.String)">
            <summary>
             Extract a list of strings  from a dataset for a list
            </summary>
            <param name="ds">Dataset with input</param>
            <param name="columnName">Column name to extract</param>
            <returns>list of strings containing the data or null</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.QueryClassList(System.String,System.Object)">
            <summary>
            Get an ArrayList of all objects selected.
            </summary>
            <param name="sql">SQL to execute usually in Sql</param>
            <param name="obj">new class of the type desired for the return array</param>
            <returns>ArrayList of objects. can be cast to desired object</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.QueryClass(System.String,System.Object)">
            <summary>
            QueryClass - get one item of specified class
            </summary>
            <param name="sql">select for one item</param>
            <param name="obj">new anyObject to provide type data</param>
            <returns>object of the requested type</returns>
        </member>
        <member name="M:BinaryLib.clsAccBase.runTransactions(System.String[])">
            <summary>
            runTransactions - execute multiple sql statements with a transaction
            This should be followed by a commit or rollback
            HAS  BEEN TESTED
            </summary>
            <param name="sqla">An array of sql commands insert/update/delete</param>
        </member>
        <member name="P:BinaryLib.clsAccBase.Sql">
            <summary>
            Get or set general sql - mostly for selects
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.SqlUpdate">
            <summary>
            Sql for Update command
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.SqlDelete">
            <summary>
            Get or set the delete sql string
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.SqlInsert">
            <summary>
            Sql to insert a record. May contain replacement variables
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.Count">
            <summary>
            Get count of rows in the table
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.SqlCount">
            <summary>
            Set up sql to get a count of rows in the database
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.Acc">
            <summary>
            Acc - MYSQL database access mechanism
            </summary>
        </member>
        <member name="P:BinaryLib.clsAccBase.login">
            <summary>
            clsMySqlLogin contains login data
            The login class is stored in the clsMySqlAccess class
            MYSQL connect string. Used for all access to database
            </summary>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.#ctor">
            <summary>
            Should only be used carefully since it will not have a connection string
            If at all possible use the constructor below
            </summary>
        </member>
        <!-- Badly formed XML comment ignored for member "M:BinaryLib.clsCollectionTypes.#ctor(System.String)" -->
        <member name="M:BinaryLib.clsCollectionTypes.Init">
            <summary>
            Provides the initial sql strings
            All classes derived from clsAccBase should be set up as shown below
            </summary>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.Get">
            <summary>
            Get all rows as an ArrayList of this class for each row
            </summary>
            <returns>array of these classes</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.Get(System.UInt32)">
            <summary>
            Get by specific type id
            </summary>
            <param name="tid">Type Id to select</param>
            <returns>Nothing - This class filled in</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.Get(System.String)">
            <summary>
            Get by specific name
            </summary>
            <param name="nm">Name to select</param>
            <returns>nothing This class contains the data</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.Add">
            <summary>
            Inserts the current Name aS A NEW ROW
            Use these because after the insert they retrieve the
            auto incremented key that was inserted.
            </summary>
            <returns>Id of the inserted row</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionTypes.Add(System.String)">
            <summary>
            Inserts the given Name aS A NEW ROW
            </summary>
            <param name="nm">Collection type name to insert</param>
            <returns></returns>
        </member>
        <member name="P:BinaryLib.clsCollectionTypes.Name">
            <summary>
            All Properties MUST match the database definition Names, order and it is case
            sensitive.
            Defines a collection type.
            This is contacts, ebooks, MP3 files etc.
            </summary>
        </member>
        <member name="P:BinaryLib.clsCollectionTypes.TypeId">
            <summary>
            Public unique key for collection types.
            This is an unsigned int and is an autoincrement field.
            It is the primary key field.
            </summary>
        </member>
        <member name="T:BinaryLib.clsMP3">
            <summary>
            clsMP3 - MP3 File handler. Parses MP3 files into various components
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.path">
            <summary>
            path - path to file
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.version">
            <summary>
            version - version of MP3 file
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.layers">
            <summary>
            layers - MP3 layers
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.channelModes">
            <summary>
            MP3 channel modes
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.mp3">
            <summary>
            mp3 - filestream for reading file
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.haveV2Tags">
            <summary>
             indicates presence of Version 2 tags within file
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.isOpen">
            <summary>
            file open status
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.extendedHdr">
            <summary>
            are extended headers present
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.experimental">
            <summary>
            is experimental data present
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.footer">
            <summary>
            has footer been read
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.startTags">
            <summary>
            offset to start of tags
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.currentPos">
            <summary>
            current file position
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.tagsEof">
            <summary>
            points one byte past tags
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.v2Tags">
            <summary>
            v2Tags - List of the Version 2 tags present
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.headerSize">
            <summary>
            size of the header
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.tagLblSize">
            <summary>
            version 1 = 3 bytes 2+ = 4 bytes
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.tagFlgSize">
            <summary>
            version 1 = 0 v 2+ = 2
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.titlev1">
            <summary>
             version 1 properties
            These all come from the file trailer record
            titlev1 - song name
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.artistv1">
            <summary>
            artistv1 - Singer
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.albumv1">
            <summary>
            albumv1 - repeat of albun name
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.yearv1">
            <summary>
            yaerv1 - year album released
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.commentv1">
            <summary>
            internal comments about the album
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.trackv1">
            <summary>
            trackv1 - track for this song
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.genrev1">
            <summary>
            short form of Genre
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.primaryGenre">
            <summary>
            expanded genre. country, rock, etc
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.bfr">
            <summary>
            byte array for binary file reads
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3.raw">
            <summary>
            raw sata from file
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3.#ctor">
            <summary>
            clsMP3 - create an empty MP3 class
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3.#ctor(System.String)">
            <summary>
            clsMP3 - create an MP3 class that knows its file name
            </summary>
            <param name="filename"></param>
        </member>
        <member name="M:BinaryLib.clsMP3.init">
            <summary>
            init - initialize class. currently empty
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3.v2Count">
            <summary>
            v2Count get a count of the number of tags present
            </summary>
            <returns>int the count</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.findTag(System.String)">
            <summary>
            findTag - find and return a specific tag
            </summary>
            <param name="tg">The tag name to find</param>
            <returns>clsMp3v2Tag class or null if not found</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.saveImage(System.String)">
            <summary>
            saveImage - saves an embedded image in an external file
            </summary>
            <param name="path">path and file name to save</param>
            <returns>true if OK false if error</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.open">
            <summary>
            open - opens a filestream on an mp3 file after class is constructed
            </summary>
            <returns>true if OK else false</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.processFile">
            <summary>
            processFile handle the mp3 file
            This drives the whole mp3 processing
            </summary>
            <returns>false for errors or true for succes</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.processTags">
            <summary>
             process the tags in the file
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3.getV2Tags">
            <summary>
            getV2Tags - reads the v2 tags and adds to the list
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3.getEnt(System.Int32,System.Int32)">
            <summary>
            getEnt - convert specific raw bytes to a string
            data is in the raw array
            </summary>
            <param name="strt">start position</param>
            <param name="len">number of bytes to convert</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3.getV1Tags">
            <summary>
            getV1Tags - get the version 1 tags.
            exits with file position pointing at start of tags
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3.processHeader">
            <summary>
            processHeader read MP3 header
            This code supports mp3 2.2, 2.3, and 2.4
            </summary>
            <returns>true if it is an mp3 file</returns>
        </member>
        <member name="M:BinaryLib.clsMP3.syncSafeLength(System.Byte[])">
            <summary>
            syncSafeLength 28 bit length in 4 bytes
            Each high order bit is zero so
            0x7f 0x7f 0x7f 0x7f translates to
            0x0f 0xff 0xff 0xff
            </summary>
            <param name="bfr"></param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3.cvtLen">
            <summary>
            cvtLen normal big endian length for all else
            </summary>
            <param name="bfr"></param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3.getstr(System.Byte[]@,System.Int32)">
            <summary>
            getstr - convert array of bytes to string
            </summary>
            <param name="t">byte array input</param>
            <param name="len">number of bytes to convert</param>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMP3.getData(System.Int32)">
            <summary>
            getData - reads chunks of the mp3 file into bfr for specified length.
            file is positioned to byte after len
            </summary>
            <param name="len">number of bytes to read</param>
            <returns>number of bytes read</returns>
        </member>
        <member name="P:BinaryLib.clsMP3.Genre">
            <summary>
            Public properties for the above
            </summary>
        </member>
        <member name="T:BinaryLib.clsUserPhotoId">
            <summary>
            Class to represent rows in the UserPhotoId table.
            Assigns a photograph id and path to a user in PPT.
            This class is used in conjunction with the DataProvider class
            to give a database independant way to insert or update the 
            data rows in the table. The data appears as a normal class object.
            </summary>
        </member>
        <member name="M:BinaryLib.clsUserPhotoId.#ctor">
            <summary>
            Empty constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsUserPhotoId.#ctor(System.Int32,System.String)">
            <summary>
            build class for specific user
            </summary>
            <param name="usr"></param>
            <param name="path"></param>
        </member>
        <member name="P:BinaryLib.clsUserPhotoId.Pic64Path">
            <summary>
            Path to users photo
            </summary>
        </member>
        <member name="P:BinaryLib.clsUserPhotoId.UserId">
            <summary>
            id for this user
            </summary>
        </member>
        <member name="P:BinaryLib.clsUserPhotoId.PhotoId">
            <summary>
            assigned photoId
            </summary>
        </member>
        <member name="T:BinaryLib.clsRawMp3Root">
            <summary>
            Derived class for the root a a given collection
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawMp3Root.rootPath">
            <summary>
            path to root of collection on disk
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawMp3Root.rootid">
            <summary>
            user id of the root user
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawMp3Root.fromDrive">
            <summary>
            drive for source of collection
            </summary>
        </member>
        <member name="F:BinaryLib.clsRawMp3Root.toDrive">
            <summary>
            target drive for destination collection
            </summary>
        </member>
        <member name="M:BinaryLib.clsRawMp3Root.#ctor(System.String)">
            <summary>
            Create with connection string.
            This is where data extracted from the files will reside.
            </summary>
            <param name="c">Connection string</param>
        </member>
        <member name="M:BinaryLib.clsRawMp3Root.#ctor(System.String,System.String,System.String,System.String)">
            <summary>
            Construct with details.
            </summary>
            <param name="h">host or server</param>
            <param name="u">user name</param>
            <param name="p">user password</param>
            <param name="d">database to use</param>
        </member>
        <member name="M:BinaryLib.clsRawMp3Root.load(System.String)">
            <summary>
            load fills the dataset using sql supplied
            </summary>
            <param name="sql">sql to execute</param>
        </member>
        <member name="T:BinaryLib.clsMySqlLogin">
            <summary>
            clsMySqlLogin - class to store all the inf necessary to
            log in to a MYSQL database.
            This class DOES NOT access the database in any way.
            It is assumed the user will have a login screen to capture
            the necessary information.
            
            It can be construct three ways:
            1. provide a complete connection string which has all the parameters
            2. provide seperate strings for host,userId,password,database, and pooling
            3. Use the properties to individually set Host,User,Pws,DbName,Pooling
            
            For type 2 and 3 when the last value is entered a connection string is
            built and can be accessed as ConnectString.
            
            For type 1 the connection string is parsed and the individual fields are set.
            
            If the user supplies a connection string without the database name or pooling
            parameter the connect string can be used to connect to the database as long
            as the user issues a SQL "use database" command before anything else.
            
            Once a connection string has been made it can not be changed. Make a new
            clsMySqlLogin to do this.
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.#ctor">
            <summary>
            Default constructor builds an administrator login
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.#ctor(System.String)">
            <summary>
            clsMySqlLogin -  construct using full connect string
            The connect string is parsed to fill in host,user,password,database and pooling
            a connect string looks like
            server=localhost; user id=name; password=xxx; pooling=true
            no trailing ;
            </summary>
            <param name="str">complete connect string</param>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.#ctor(System.String,System.String,System.String,System.String,System.Boolean)">
            <summary>
            clsMySqlLogin - constructor to supply individual items
            When this is done the ConnectString will be valid
            </summary>
            <param name="srvName">localhost etc</param>
            <param name="usrId">database user id</param>
            <param name="pwd">users password</param>
            <param name="dbName">name of the database to use</param>
            <param name="pool">true or false</param>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.#ctor(System.String,System.String)">
            <summary>
            Make a connection string from user and password
            </summary>
            <param name="usr">database user name</param>
            <param name="pwd">password</param>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.Emit">
            <summary>
            Build a default connection string
            Can not assume that pptGlobal has been set
            This builds one from scratch
            </summary>
            <returns>nothing</returns>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.mkConn">
            <summary>
            Make a connection string if not given. Combines values for host,user,password,database, and pooling.
            </summary>
        </member>
        <member name="M:BinaryLib.clsMySqlLogin.mkConn(System.String,System.String)">
            <summary>
            mkConn - make a ppt default connection to localhost and ppt database
            Pooling is set true.
            </summary>
            <param name="usr">Database user name</param>
            <param name="pwd">password if any</param>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.ConnectString">
            <summary>
            MYSQL connection string. SHould be complete.
            </summary>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.Host">
            <summary>
            Host name such as localhost or a server name
            </summary>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.User">
            <summary>
            User name as defined in the database
            </summary>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.Pwd">
            <summary>
            Password for the user of the database
            Warning! This string is NOT encrypted
            </summary>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.Dbname">
            <summary>
            Name of the database to connect.
            </summary>
        </member>
        <member name="P:BinaryLib.clsMySqlLogin.Pooling">
            <summary>
            Whether or not to use connection pooling. Usually true.
            </summary>
        </member>
        <member name="T:BinaryLib.clsMyCollection">
            <summary>
            Class defining a collection and its location
            </summary>
        </member>
        <member name="F:BinaryLib.clsMyCollection.PathToTopDir">
            <summary>
            microsoft string with path
            This needs to be adjusted before going to mysql
            this will be stored in the collectionpaths table
            </summary>
        </member>
        <member name="M:BinaryLib.clsMyCollection.#ctor">
            <summary>
            Constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsMyCollection.#ctor(System.String)">
            <summary>
            Constructor with connection string
            </summary>
            <param name="connectionString"></param>
        </member>
        <member name="M:BinaryLib.clsMyCollection.#ctor(BinaryLib.clsMyCollection)">
            <summary>
            copy constructor
            This is a deep copy
            </summary>
            <param name="mc">pass connection string to base class</param>
        </member>
        <member name="M:BinaryLib.clsMyCollection.IsValid">
            <summary>
            determines if class data fields are all present
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Init">
            <summary>
            Provides the initial sql strings
            All classes derived from clsAccBase should be set up as shown below
            These are set up for string format commands
            </summary>
        </member>
        <member name="M:BinaryLib.clsMyCollection.FillOne(BinaryLib.clsMyCollection)">
            <summary>
            Fill out this instance of the class
            </summary>
            <param name="tmp">class to copy</param>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Get">
            <summary>
            Get all rows as an ArrayList of this class for each row
            </summary>
            <returns>array of these classes</returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Get(System.UInt32)">
            <summary>
            Get by specific definition id
            </summary>
            <param name="did">Type Id to select</param>
            <returns>Nothing - This class filled in</returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Get(System.String)">
            <summary>
            Get by specific collection name
            </summary>
            <param name="nm">Name to select</param>
            <returns>nothing This class contains the data</returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.AddProc">
            <summary>
            Not implemented
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Add">
            <summary>
            Inserts the current Name aS A NEW ROW
            Use these because after the insert they retrieve the
            auto incremented key that was inserted.
            </summary>
            <returns>Id of the inserted row</returns>
        </member>
        <member name="M:BinaryLib.clsMyCollection.Add(System.String,System.String,System.String)">
            <summary>
            Inserts the given data aS A NEW ROW
            The keys MUST have been set except for DefId
            </summary>
            <param name="nm">Collection name to insert</param>
            <param name="drive">disk drive for collection</param>
            <param name="pth">Top level directory for the collection</param>
            <returns>DefId the auto incremented key</returns>
        </member>
        <member name="P:BinaryLib.clsMyCollection.CollectionPaths">
            <summary>
            The collection paths table is maintained by this class
            since there is a one to one relationship
            </summary>
        </member>
        <member name="P:BinaryLib.clsMyCollection.DiskDrive">
            <summary>
            Disk drive containing the collection
            </summary>
        </member>
        <member name="P:BinaryLib.clsMyCollection.CollectionName">
            <summary>
            External name for this collection - displayed
            </summary>
        </member>
        <member name="P:BinaryLib.clsMyCollection.TypeId">
            <summary>
            ID of collection type
            </summary>
        </member>
        <member name="P:BinaryLib.clsMyCollection.Uid">
            <summary>
            PPT user ID of the owner of this collection
            </summary>
        </member>
        <member name="P:BinaryLib.clsMyCollection.DefId">
            <summary>
            Primary key
            </summary>
        </member>
        <member name="T:BinaryLib.frameEntry">
            <summary>
            frameEntry - description of mp3 tag names and action to take
            This describes one entry in the list of tags in an mp3
            </summary>
        </member>
        <member name="F:BinaryLib.frameEntry.tagName">
            <summary>
            tagName - name of the tag 3 or 4 bytes
            </summary>
        </member>
        <member name="F:BinaryLib.frameEntry.dbColumnName">
            <summary>
            dcColumnName - name in the database
            </summary>
        </member>
        <member name="F:BinaryLib.frameEntry.mustDecode">
            <summary>
            mustDecode - is further decoding required?
            </summary>
        </member>
        <member name="M:BinaryLib.frameEntry.#ctor(System.String,System.String,System.Boolean)">
            <summary>
            frameEntry - ctor for one entry in frame table
            </summary>
            <param name="tag">name of tag</param>
            <param name="col">DB column name</param>
            <param name="dc">is decoding required?</param>
        </member>
        <member name="M:BinaryLib.frameEntry.#ctor(System.String,System.String)">
            <summary>
            frameEntry - ctor for one entry in frame table
            </summary>
            <param name="tag">name of tag</param>
            <param name="col">DB column name</param>
        </member>
        <member name="T:BinaryLib.clsMP3Frame">
            <summary>
            clsMp3Frame - static class to define mp3 tags
            contains a list of all the tag names found in an mp3
            </summary>
        </member>
        <member name="F:BinaryLib.clsMP3Frame.frames">
            <summary>
            frames - table of valid tag names stored as a sorted dictionary
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3Frame.#cctor">
            <summary>
            clsMP3Frame - static constructor for single instance of the table
            </summary>
        </member>
        <member name="M:BinaryLib.clsMP3Frame.getFrame(System.String)">
            <summary>
            getFrame - get the frameEntry for a given tag
            </summary>
            <param name="tg">tag to find</param>
            <returns>the frameEntry class</returns>
        </member>
        <member name="T:BinaryLib.clsUsers">
            <summary>
            clsUsers - class to support PPT users
            Used with the DataProvidor class to give
            a normal class representation of rows from a table.
            </summary>
        </member>
        <member name="M:BinaryLib.clsUsers.#ctor(System.Int32,System.String,System.Char,System.String)">
            <summary>
            Build a row for insertion
            </summary>
            <param name="id">PPT user id</param>
            <param name="usr">PPT user name</param>
            <param name="root">'Y" or 'N' for admin access</param>
            <param name="dbname">Database user name</param>
        </member>
        <member name="M:BinaryLib.clsUsers.#ctor(System.String)">
            <summary>
            Build with connection string
            </summary>
        </member>
        <member name="M:BinaryLib.clsUsers.#ctor">
            <summary>
            Empty except for sql strings
            </summary>
        </member>
        <member name="M:BinaryLib.clsUsers.Init">
            <summary>
            Set the default sql strings
            </summary>
        </member>
        <member name="M:BinaryLib.clsUsers.Get">
            <summary>
            Get all rows as an ArrayList of this class for each row
            </summary>
            <returns>array of these classes</returns>
        </member>
        <member name="M:BinaryLib.clsUsers.Get(System.Int32)">
            <summary>
            Get by specific type id
            </summary>
            <param name="uid">User Id to select</param>
            <returns>Nothing - This class filled in</returns>
        </member>
        <member name="M:BinaryLib.clsUsers.Get(System.String)">
            <summary>
            Get by specific name
            </summary>
            <param name="unm">ppt user Name to select</param>
            <returns>nothing This class contains the data</returns>
        </member>
        <member name="M:BinaryLib.clsUsers.Add">
            <summary>
            Inserts the current class aS A NEW ROW
            Use the properties to set the valuse first.
            Use these because after the insert they retrieve the
            auto incremented key that was inserted.
            </summary>
            <returns>Id of the inserted row</returns>
        </member>
        <member name="P:BinaryLib.clsUsers.DbUser">
            <summary>
            Name of database user
            </summary>
        </member>
        <member name="P:BinaryLib.clsUsers.Admin">
            <summary>
            User has Admin access - default 'Y' else 'N'
            </summary>
        </member>
        <member name="P:BinaryLib.clsUsers.User">
            <summary>
            PPT user name
            </summary>
        </member>
        <member name="P:BinaryLib.clsUsers.Uid">
            <summary>
            PPT user id
            </summary>
        </member>
        <member name="T:BinaryLib.clsPaths">
            <summary>
            class to hold a microsoft Path for Mysql
            This make sure embedded single quotes are properly escaped with a backslash
            Typical use of this is:
            string newVal = new clsPaths(PathNameFromOpenFileDialog).Path);
            newVal will contain the data to put in the database
            </summary>
        </member>
        <member name="M:BinaryLib.clsPaths.#ctor(System.String)">
            <summary>
            constructor with a path name
            This saves the path and has properties to set or get it.
            </summary>
            <param name="pth">Path to store</param>
        </member>
        <member name="M:BinaryLib.clsPaths.xlate(System.String)">
            <summary>
            Translate single quotes into escaped sequences
            </summary>
            <param name="s"></param>
            <returns></returns>
        </member>
        <member name="P:BinaryLib.clsPaths.Path">
            <summary>
            Holds a microsoft path string
            Used to add escape characters to embedded single quotes
            to avoid problems storing in the database.
            Use Path = x or y = Path to set or get the adjusted path or
            use the form shown above.
            </summary>
        </member>
        <member name="T:BinaryLib.clsCollectionPaths">
            <summary>
            Stores paths to the disk based collections
            This table has a one to one relation with definedcollections table
            </summary>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.#ctor">
            <summary>
            Empty constructor
            </summary>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.#ctor(System.String)">
            <summary>
            Proper constructor for this class
            </summary>
            <param name="connectionString">database connection string</param>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.#ctor(BinaryLib.clsCollectionPaths)">
            <summary>
            copy self
            </summary>
            <param name="cp"></param>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.dbPath">
            <summary>
            Get the internal data for storing in the database
            </summary>
            <returns>database version of the string</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.IsValid">
            <summary>
            Test if required parameters are present
            </summary>
            <returns></returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.Init">
            <summary>
            Provides the initial sql strings
            All classes derived from clsAccBase should be set up as shown below
            These are set up for string format commands
            </summary>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.FillOne(BinaryLib.clsCollectionPaths)">
            <summary>
            Fill out this instance of the class
            </summary>
            <param name="cp">class to copy</param>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.Get">
            <summary>
            Get all rows as an ArrayList of this class for each row
            </summary>
            <returns>array of these classes</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.Get(System.Int32)">
            <summary>
            Get by specific definition id
            </summary>
            <param name="did">definition Id to select</param>
            <returns>Nothing - This class filled in</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.AddProc">
            <summary>
            Execute stored proc for inserts
            Not yet implemented
            </summary>
            <returns>rows effected</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.Add">
            <summary>
            Inserts the current Path aS A NEW ROW
            Use these because after the insert they retrieve the
            auto incremented key that was inserted.
            </summary>
            <returns>Id of the inserted row</returns>
        </member>
        <member name="M:BinaryLib.clsCollectionPaths.Add(System.Int32,System.String)">
            <summary>
            Inserts the given data aS A NEW ROW
            The keys MUST have been set except for ukey
            </summary>
            <param name="id">collection id</param>
            <param name="pth">Top level directory for the collection External format</param>
            <returns>ukey the auto incremented key</returns>
        </member>
        <member name="P:BinaryLib.clsCollectionPaths.Path">
            <summary>
            Path to the top directory of the collection
            Going in it is converted to a mysql path
            Comint out it is an external path
            </summary>
        </member>
        <member name="P:BinaryLib.clsCollectionPaths.DefId">
            <summary>
            collection it belongs to
            </summary>
        </member>
        <member name="P:BinaryLib.clsCollectionPaths.ukey">
            <summary>
            unique primary key
            </summary>
        </member>
    </members>
</doc>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
Senior software developer / consultant with 30 years experience.

Comments and Discussions