static public Dictionary<string, MySqlParameter> GetParameters(Guid dataID,
            esProviderSpecificMetadata providerMetadata, esColumnMetadataCollection columns)
        {
            lock (parameterCache)
            {
                if (!parameterCache.ContainsKey(dataID))
                {
                    // The Parameters for this Table haven't been cached yet, this is a one time operation
                    Dictionary<string, MySqlParameter> types = new Dictionary<string, MySqlParameter>();

                    MySqlParameter param1;
                    foreach (esColumnMetadata col in columns)
                    {
                        esTypeMap typeMap = providerMetadata.GetTypeMap(col.PropertyName);
                        if (typeMap != null)
                        {
                            string nativeType = typeMap.NativeType;
                            MySqlDbType dbType = Cache.NativeTypeToDbType(nativeType);

                            param1 = new MySqlParameter(Delimiters.Param + col.PropertyName, dbType, 0, col.Name);
                            param1.SourceColumn = col.Name;

                            switch (dbType)
                            {
                                case MySqlDbType.Decimal:
                                case MySqlDbType.NewDecimal:
                                case MySqlDbType.Double:
                                case MySqlDbType.Float:
                                case MySqlDbType.Int16:
                                case MySqlDbType.Int24:
                                case MySqlDbType.Int32:
                                case MySqlDbType.Int64:
                                case MySqlDbType.UInt16:
                                case MySqlDbType.UInt24:
                                case MySqlDbType.UInt32:
                                case MySqlDbType.UInt64:

                                    param1.Size = (int)col.CharacterMaxLength;
                                    param1.Precision = (byte)col.NumericPrecision;
                                    param1.Scale = (byte)col.NumericScale;
                                    break;

                                case MySqlDbType.String:
                                case MySqlDbType.VarString:
                                case MySqlDbType.VarChar:
                                    param1.Size = (int)col.CharacterMaxLength;
                                    break;

                            }
                            types[col.Name] = param1;
                        }
                    }

                    parameterCache[dataID] = types;
                }
            }

            return parameterCache[dataID];
        }
        static public Dictionary<string, SqlCeParameter> GetParameters(Guid dataID,
            esProviderSpecificMetadata providerMetadata, esColumnMetadataCollection columns)
        {
            lock (parameterCache)
            {
                if (!parameterCache.ContainsKey(dataID))
                {
                    // The Parameters for this Table haven't been cached yet, this is a one time operation
                    Dictionary<string, SqlCeParameter> types = new Dictionary<string, SqlCeParameter>();

                    SqlCeParameter param1;
                    foreach (esColumnMetadata col in columns)
                    {
                        esTypeMap typeMap = providerMetadata.GetTypeMap(col.PropertyName);
                        if (typeMap != null)
                        {
                            string nativeType = typeMap.NativeType;
                            SqlDbType dbType = Cache.NativeTypeToDbType(nativeType);

                            param1 = new SqlCeParameter(Delimiters.Param + col.PropertyName, dbType, 0, col.Name);
                            param1.SourceColumn = col.Name;

                            switch (dbType)
                            {
                                case SqlDbType.Decimal:

                                    param1.Precision = (byte)col.NumericPrecision;
                                    param1.Scale = (byte)col.NumericScale;
                                    break;

                                case SqlDbType.DateTime:

                                    param1.Precision = 23;
                                    param1.Scale = 3;
                                    break;

                                case SqlDbType.SmallDateTime:

                                    param1.Precision = 16;
                                    break;

                            }
                            types[col.Name] = param1;
                        }
                    }

                    parameterCache[dataID] = types;
                }
            }

            return parameterCache[dataID];
        }
        static public Dictionary<string, VistaDBParameter> GetParameters(Guid dataID,
            esProviderSpecificMetadata providerMetadata, esColumnMetadataCollection columns)
        {
            lock (parameterCache)
            {
                if (!parameterCache.ContainsKey(dataID))
                {
                    // The Parameters for this Table haven't been cached yet, this is a one time operation
                    Dictionary<string, VistaDBParameter> types = new Dictionary<string, VistaDBParameter>();

                    VistaDBParameter param1;
                    foreach (esColumnMetadata col in columns)
                    {
                        esTypeMap typeMap = providerMetadata.GetTypeMap(col.PropertyName);
                        if (typeMap != null)
                        {
                            string nativeType = typeMap.NativeType;
                            VistaDBType dbType = Cache.NativeTypeToDbType(nativeType);

                            param1 = new VistaDBParameter(Delimiters.Param + col.PropertyName, dbType, 0, col.Name);
                            param1.SourceColumn = col.Name;

                            switch (dbType)
                            {
                                case VistaDBType.BigInt:
                                case VistaDBType.Int:
                                case VistaDBType.SmallInt:
                                case VistaDBType.Decimal:
                                case VistaDBType.Float:
                                case VistaDBType.Money:
                                case VistaDBType.SmallMoney:

                                    param1.Size = (int)col.CharacterMaxLength;
                                    break;

                            }
                            types[col.Name] = param1;
                        }
                    }

                    parameterCache[dataID] = types;
                }
            }

            return parameterCache[dataID];
        }
        private void lboxCollections_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                this.chkColumns.Items.Clear();

                string collectionName = this.lboxCollections.SelectedItem.ToString();
                this.esColumnCollection = helper.GetColumns(this.collections[collectionName]);

                foreach (esColumnMetadata col in this.esColumnCollection)
                {
                    this.chkColumns.Items.Add(col.PropertyName);
                }

                for (int i = 0; i < this.chkColumns.Items.Count; i++)
                {
                    this.chkColumns.SetItemChecked(i, true);
                }
            }
            catch { }
        }
        private void bntOk_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.lboxCollections.SelectedIndex > -1)
                {
                    this.esCollectionName = this.lboxCollections.SelectedItem.ToString();
                    this.esColumnCollection = helper.GetColumns(this.collections[this.esCollectionName]);

                    this.SelectedColumns = new List<string>();
                    foreach (string columnName in this.chkColumns.CheckedItems)
                    {
                        this.SelectedColumns.Add(columnName);
                    }
                }
            }
            catch { }
        }
        public esColumnMetadataCollection GetColumns(esEntityCollectionBase collection)
        {
            collection.EnableHierarchicalBinding = false;

            PropertyDescriptorCollection props = null;

            try
            {
                MethodInfo GetEntity = collection.GetType().GetMethod("CreateEntity", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                esEntity entity = GetEntity.Invoke(collection, null) as esEntity;

                MethodInfo GetProperties = collection.GetType().GetMethod("GetProperties", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                props = GetProperties.Invoke(collection, new object[] { entity }) as PropertyDescriptorCollection;
            }
            catch { }

            MethodInfo get_Meta = collection.GetType().GetMethod("get_Meta", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
            IMetadata meta = get_Meta.Invoke(collection, null) as IMetadata;
            esColumnMetadataCollection esColumns =  meta.Columns;

            esColumnMetadataCollection esCollection = new esColumnMetadataCollection();
            try
            {
                foreach (esColumnMetadata col in esColumns)
                {
                    esCollection.Add(col);
                }
            }
            catch { }

            try
            {
                if (props != null)
                {
                    esExtendedPropertyAttribute att = new esExtendedPropertyAttribute();
                    foreach (PropertyDescriptor prop in props)
                    {
                        if (esColumns.FindByPropertyName(prop.Name) == null)
                        {
                            if (prop.Attributes.Contains(att))
                            {
                                esColumnMetadata col = new esColumnMetadata(prop.Name, 1000, prop.PropertyType);
                                col.PropertyName = prop.Name;
                                esCollection.Add(col);
                            }
                        }
                    }
                }
            }
            catch { }

            return esCollection;
        }