public FieldList GetFields(string tbl) { FieldList flds = null; if (_columns == null) { _columns = new Dictionary <string, FieldList>(); } if (!_columns.TryGetValue(tbl, out flds)) { if (bOpened) { DbDataReader dr = null; string sSQL; sSQL = string.Format(System.Globalization.CultureInfo.InvariantCulture, "select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_KEY,COLUMN_TYPE, EXTRA from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '{0}' and TABLE_SCHEMA = '{1}' order by ORDINAL_POSITION", tbl, Schema); DbCommand cmd = _connection.CreateCommand(); cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = sSQL; try { if (_connection.State == System.Data.ConnectionState.Closed) { _connection.Open(); } dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); flds = new FieldList(); int n = 0; while (dr.Read()) { EPField fld = new EPField(); fld.Name = (string)dr[0]; fld.Indexed = (string.CompareOrdinal("PRI", VPLUtil.ObjectToString(dr[3])) == 0); fld.Index = n; fld.FromTableName = tbl; bool bUnsigned = (VPLUtil.ObjectToString(dr[4]).IndexOf("unsigned", StringComparison.OrdinalIgnoreCase) >= 0); fld.OleDbType = stringToOleDbType(VPLUtil.ObjectToString(dr[1]), bUnsigned); if (dr[2] != null && dr[2] != DBNull.Value) { fld.DataSize = VPLUtil.ObjectToInt(dr[2]); } fld.IsIdentity = (string.Compare("auto_increment", VPLUtil.ObjectToString(dr[5]), StringComparison.OrdinalIgnoreCase) == 0); flds.Add(fld); n++; } _columns.Add(tbl, flds); } finally { if (dr != null) { dr.Close(); dr = null; } if (_connection.State != System.Data.ConnectionState.Closed) { _connection.Close(); } } } } if (flds == null) { flds = new FieldList(); } return(flds); }