protected override CSSchemaColumn[] GetSchemaColumns(string tableName)
        {
            using (ICSDbConnection newConn = CreateConnection())
            {
                var schemaColumns = new List <CSSchemaColumn>();

                DataTable schemaTable = ((CSSqliteConnection)newConn).GetSchema(tableName);

                bool hasHidden        = schemaTable.Columns.Contains("IsHidden");
                bool hasIdentity      = schemaTable.Columns.Contains("IsIdentity");
                bool hasAutoincrement = schemaTable.Columns.Contains("IsAutoIncrement");

                foreach (DataRow schemaRow in schemaTable.Rows)
                {
                    var 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;
                    }

                    schemaColumns.Add(schemaColumn);
                }

                return(schemaColumns.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());
            }
        }
        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();

            }
        }
        protected override CSSchemaColumn[] GetSchemaColumns(string tableName)
        {
            using (ICSDbConnection newConn = CreateConnection())
            {
				var schemaColumns = new List<CSSchemaColumn>();

				DataTable schemaTable = ((CSSqliteConnection)newConn).GetSchema(tableName);

                bool hasHidden = schemaTable.Columns.Contains("IsHidden");
                bool hasIdentity = schemaTable.Columns.Contains("IsIdentity");
                bool hasAutoincrement = schemaTable.Columns.Contains("IsAutoIncrement");

                foreach (DataRow schemaRow in schemaTable.Rows)
                {
                    var 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;

                    schemaColumns.Add(schemaColumn);
                }

                return schemaColumns.ToArray();
            }
        }