protected override CSSchemaColumn[] GetSchemaColumns(string tableName) { using (ICSDbConnection newConn = CreateConnection()) { ICSDbCommand dbCommand = newConn.CreateCommand(); dbCommand.CommandText = "select * from " + QuoteTable(tableName); using (CSSqliteReader dataReader = (CSSqliteReader)dbCommand.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo)) { List <CSSchemaColumn> columns = new List <CSSchemaColumn>(); DataTable schemaTable = dataReader.Reader.GetSchemaTable(); bool hasHidden = schemaTable.Columns.Contains("IsHidden"); bool hasIdentity = schemaTable.Columns.Contains("IsIdentity"); bool hasAutoincrement = schemaTable.Columns.Contains("IsAutoIncrement"); foreach (DataRow schemaRow in schemaTable.Rows) { CSSchemaColumn schemaColumn = new CSSchemaColumn(); if (hasHidden && !schemaRow.IsNull("IsHidden") && (bool)schemaRow["IsHidden"]) { schemaColumn.Hidden = true; } schemaColumn.IsKey = (bool)schemaRow["IsKey"]; schemaColumn.AllowNull = (bool)schemaRow["AllowDBNull"]; schemaColumn.Name = (string)schemaRow["ColumnName"]; schemaColumn.ReadOnly = (bool)schemaRow["IsReadOnly"]; schemaColumn.DataType = (Type)schemaRow["DataType"]; schemaColumn.Size = (int)schemaRow["ColumnSize"]; if (hasAutoincrement && !schemaRow.IsNull("IsAutoIncrement") && (bool)schemaRow["IsAutoIncrement"]) { schemaColumn.Identity = true; } if (hasIdentity && !schemaRow.IsNull("IsIdentity") && (bool)schemaRow["IsIdentity"]) { schemaColumn.Identity = true; } columns.Add(schemaColumn); } return(columns.ToArray()); } } }
protected override CSSchemaColumn[] GetSchemaColumns(string tableName) { List <string> autoColumns = new List <string>(); using ( CSSqliteCommand cmd = (CSSqliteCommand)CreateCommand("select sql from sqlite_master where type='table' and name=@tablename", new CSParameterCollection("@tablename", tableName))) { string sql = (string)cmd.Command.ExecuteScalar(); Regex regex = new Regex(@"[\(,]\s*(?<column>[a-z0-9_]+).*?AUTOINCREMENT", RegexOptions.IgnoreCase); Match m = regex.Match(sql); if (m.Success) { autoColumns.Add(m.Groups["column"].Value.ToUpper()); } } List <CSSchemaColumn> columns = new List <CSSchemaColumn>(); using (CSSqliteCommand cmd = (CSSqliteCommand)CreateCommand("pragma table_info (" + tableName + ")", null)) { using (CSSqliteReader reader = (CSSqliteReader)cmd.ExecuteReader()) { while (reader.Read()) { CSSchemaColumn column = new CSSchemaColumn(); string columnName = (string)reader.Reader["name"]; column.Name = columnName; column.IsKey = reader.Reader["pk"].Convert <bool>(); column.AllowNull = !reader.Reader["notnull"].Convert <bool>(); column.ReadOnly = false; column.Size = 1000; Type dataType = null; string dbType = (string)reader.Reader["type"]; int paren = dbType.IndexOf('('); if (paren > 0) { dbType = dbType.Substring(0, paren); } dbType = dbType.ToUpper(); switch (dbType) { case "TEXT": dataType = typeof(string); break; case "VARCHAR": dataType = typeof(string); break; case "INTEGER": dataType = typeof(int); break; case "BOOL": dataType = typeof(bool); break; case "DOUBLE": dataType = typeof(double); break; case "FLOAT": dataType = typeof(double); break; case "REAL": dataType = typeof(double); break; case "CHAR": dataType = typeof(string); break; case "BLOB": dataType = typeof(byte[]); break; case "NUMERIC": dataType = typeof(decimal); break; case "DATETIME": dataType = typeof(DateTime); break; } column.DataType = dataType; column.Identity = autoColumns.Contains(columnName.ToUpper()); columns.Add(column); } } return(columns.ToArray()); } }