/// <summary>
        /// Creates a new DBSchemaTable for a returned GetSchema DbTable definition
        /// </summary>
        #region protected virtual DBSchemaTable CreateSchemaTable(TableMappingClass mapping, DataRow tblRow)

        /// <param name="tblRow"></param>
        /// <returns></returns>
        protected virtual DBSchemaTable CreateSchemaTable(TableMappingClass mapping, DataRow tblRow)
        {
            DBSchemaTable sTbl = new DBSchemaTable();

            DataColumn col = GetColumn(tblRow.Table, mapping.TableCatalogColumn, false);

            sTbl.Catalog = this.GetColumnValue(tblRow, col);

            col         = GetColumn(tblRow.Table, mapping.TableSchemaColumn, false);
            sTbl.Schema = this.GetColumnValue(tblRow, col);

            col       = GetColumn(tblRow.Table, mapping.TableNameColumn, false);
            sTbl.Name = this.GetColumnValue(tblRow, col);

            return(sTbl);
        }
        //
        // protected implementation
        //

        /// <summary>
        /// Loads a complete schema for the specified Table schema reference including all columns, and indexes.
        /// </summary>
        #region protected virtual DBSchemaTable LoadATable(DbConnection con, DBSchemaItemRef forRef)

        /// <param name="con"></param>
        /// <param name="forRef"></param>
        /// <returns></returns>
        protected virtual DBSchemaTable LoadATable(DbConnection con, DBSchemaItemRef forRef)
        {
            DBSchemaTable sTbl    = null;
            string        catalog = string.IsNullOrEmpty(forRef.Catalog) ? null : forRef.Catalog;
            string        schema  = string.IsNullOrEmpty(forRef.Schema) ? null : forRef.Schema;

            DataTable tbl     = con.GetSchema(SchemaTablesName, new string[] { catalog, schema, forRef.Name, null });
            DataTable columns = con.GetSchema(SchemaColumnsName, new string[] { catalog, schema, forRef.Name, null });

            if (tbl.Rows.Count > 0)
            {
                DataRow                 tblRow        = tbl.Rows[0];
                TableMappingClass       tblmapping    = this.GetTableMapping();
                TableColumnMappingClass tblcolmapping = this.GetTableColumnMapping();

                sTbl = CreateSchemaTable(tblmapping, tblRow);

                FillTableColumns(sTbl, tblcolmapping, columns);
            }


            return(sTbl);
        }
        /// <summary>
        /// Creates and populates the DBSchemaTable.Columns property based upon a returned DataTable for the GetSchema("Columns") query
        /// </summary>
        #region private void FillTableColumns(DBSchemaTable sTbl,  DataTable columns)

        /// <param name="sTbl"></param>
        /// <param name="columns"></param>
        protected virtual void FillTableColumns(DBSchemaTable sTbl, TableColumnMappingClass mapping, DataTable columns)
        {
            DataColumn colCatalog = this.GetColumn(columns, mapping.TableCatalogColumn, false);
            DataColumn colSchema  = this.GetColumn(columns, mapping.TableSchemaColumn, false);
            DataColumn colTable   = this.GetColumn(columns, mapping.TableNameColumn, true);
            DataColumn colName    = this.GetColumn(columns, mapping.ColumnNameColumn, true);
            DataColumn colDefault = this.GetColumn(columns, mapping.DefaultValueColumn, false);
            DataColumn colType    = this.GetColumn(columns, mapping.DataTypeColumn, true);
            DataColumn colMaxLen  = this.GetColumn(columns, mapping.MaxCharacterLengthColumn, false);
            DataColumn colAuto    = this.GetColumn(columns, mapping.AutoNumberColumn, false);
            DataColumn colNull    = this.GetColumn(columns, mapping.IsNullableColumn, false);
            DataColumn colOrdinal = this.GetColumn(columns, mapping.OrdinalPositionColumn, false);
            DataColumn colPK      = this.GetColumn(columns, mapping.PrimaryKeyColumn, false);

            foreach (DataRow colRow in columns.Rows)
            {
                if (sTbl.Name == colRow[colTable].ToString())
                {
                    DBSchemaTableColumn column = new DBSchemaTableColumn();
                    column.Name = GetColumnValue(colRow, colName);

                    if (string.IsNullOrEmpty(column.Name))
                    {
                        throw new DBSchemaProviderException(string.Format(Errors.SchemaColumnCannotBeEmpty, mapping.ColumnNameColumn));
                    }

                    string type     = GetColumnValue(colRow, colType);
                    string len      = GetColumnValue(colRow, colMaxLen);
                    string auto     = GetColumnValue(colRow, colAuto);
                    string ord      = GetColumnValue(colRow, colOrdinal);
                    string nullable = GetColumnValue(colRow, colNull);
                    string def      = GetColumnValue(colRow, colDefault);
                    string pk       = GetColumnValue(colRow, colPK);
                    int    i;
                    bool   b;

                    //Set AutoAssign
                    if (auto.IndexOf("auto_increment") > -1)
                    {
                        b = true;
                    }
                    else if (auto.ToLower() == "yes")
                    {
                        b = true;
                    }
                    else if (bool.TryParse(auto, out b) == false)
                    {
                        b = false;
                    }
                    column.AutoAssign = b;

                    //Set DbType
                    column.DbType = GetDbTypeForSqlType(type);

                    //Set DefaultValue and HasDefault
                    column.HasDefault   = string.IsNullOrEmpty(def) == false;
                    column.DefaultValue = def;

                    //Set IsNullable
                    if (nullable.ToLower() == "yes")
                    {
                        b = true;
                    }
                    else if (!bool.TryParse(nullable, out b))
                    {
                        b = false;
                    }
                    column.Nullable = b;

                    //Set ordinal position
                    if (int.TryParse(ord, out i))
                    {
                        column.OrdinalPosition = i;
                    }
                    else
                    {
                        column.OrdinalPosition = -1;
                    }

                    //Set readonly (same as autoassign)
                    column.ReadOnly = column.AutoAssign;

                    //Set column.Type
                    column.Type = DBHelper.GetRuntimeTypeForDbType(column.DbType);

                    //Set Primary Key
                    if (pk.ToLower() == "yes")
                    {
                        b = true;
                    }
                    else if (!bool.TryParse(pk, out b))
                    {
                        b = false;
                    }
                    column.PrimaryKey = b;

                    //Set Size
                    if (string.IsNullOrEmpty(len) == false && int.TryParse(len, out i))
                    {
                        column.Size = i;
                    }
                    else
                    {
                        column.Size = -1;
                    }


                    sTbl.Columns.Add(column);
                }
            }
        }