Example #1
0
        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());
            }
        }