コード例 #1
0
        /// <summary>
        /// 列的解析默认值设置.
        /// </summary>
        /// <param name="definition"></param>
        /// <param name="DbParameters"></param>
        /// <returns></returns>
        private string ParseDefaultValue(DbTableColumnDefinition definition, ref List <IDbDataParameter> DbParameters)
        {
            IDescription valueDes = definition.Default as IDescription;

            if (valueDes == null)
            {
                switch (definition.DataType)
                {
                case GenericDbType.Boolean:
                    return(string.Format("DEFAULT({0})", Convert.ToBoolean(definition.Default) ? 1 : 0));

                case GenericDbType.SmallInt:
                case GenericDbType.Int:
                case GenericDbType.BigInt:
                case GenericDbType.Single:
                case GenericDbType.Money:
                case GenericDbType.Double:
                    return(string.Format("DEFAULT({0})", definition.Default));

                case GenericDbType.Binary:
                case GenericDbType.VarBinary:
                case GenericDbType.Image:
                    throw new NotSupportedException(string.Format("Data type {0} does not support setting default value.", definition.Default));

                default:
                    return(string.Format("DEFAULT('{0}')", definition.Default.ToString()));
                }
            }
            valueDes.DescriptionParserAdapter = this.Adapter;
            return(string.Format("DEFAULT({0})", valueDes.GetParser().Parsing(ref DbParameters)));
        }
コード例 #2
0
        /// <summary>
        /// 解析指定列定义的数据类型.
        /// </summary>
        /// <param name="definition">列定义信息.</param>
        /// <returns></returns>
        private string ParseDbType(DbTableColumnDefinition definition)
        {
            switch (definition.DataType)
            {
            case GenericDbType.Char:
            case GenericDbType.NChar:
                return(string.Format("CHAR({0})", definition.Size));

            case GenericDbType.VarChar:
            case GenericDbType.NVarchar:
                return(string.Format("VARCHAR({0})", definition.Size));

            case GenericDbType.Text:
                return("TEXT");

            case GenericDbType.NText:
                return("LONGTEXT");

            case GenericDbType.SmallInt:
                return("SMALLINT");

            case GenericDbType.Int:
                return("INT");

            case GenericDbType.BigInt:
                return("BIGINT");

            case GenericDbType.Money:
                return("DECIMAL");

            case GenericDbType.Single:
                return("FLOAT");

            case GenericDbType.Double:
                return("DOUBLE");

            case GenericDbType.Boolean:
                return("BOOL");

            case GenericDbType.Binary:
                return("BLOB");

            case GenericDbType.VarBinary:
                return("MEDIUMBLOB");

            case GenericDbType.Image:
                return("LONGBLOB");

            case GenericDbType.Time:
                return("TIME");

            case GenericDbType.Date:
                return("DATE");

            case GenericDbType.DateTime:
                return("DATETIME");
            }
            return(string.Empty);
        }
コード例 #3
0
 /// <summary>
 /// 解析列的外键设置.
 /// </summary>
 /// <param name="table">当前表名.</param>
 /// <param name="definition">列定义信息.</param>
 /// <param name="writer">将外键命令段写入该缓冲区.</param>
 /// <returns></returns>
 private void ParseForeignKey(string table, DbTableColumnDefinition definition, StringBuilder writer)
 {
     if (writer.Length > 0)
         writer.Append(",").AppendLine();
     writer.AppendFormat("\tCONSTRAINT {2}FK_{0}_{1}{3} FOREIGN KEY ({2}{1}{3})", table, definition.Name, ElemIdentifierL, ElemIdentifierR);
     writer.AppendFormat(" REFERENCES {0}{2}{1} ({0}{3}{1})", ElemIdentifierL, ElemIdentifierR, definition.ForeignKey.Table, definition.ForeignKey.Column);
     writer.AppendFormat(" ON DELETE {0} ON UPDATE {1}", definition.ForeignKey.OnDelete, definition.ForeignKey.OnUpdate);
 }
コード例 #4
0
        /// <summary>
        /// 解析指定列定义的数据类型.
        /// </summary>
        /// <param name="definition">列定义信息.</param>
        /// <returns></returns>
        private string ParseDbType(DbTableColumnDefinition definition)
        {
            switch (definition.DataType)
            {
            case GenericDbType.Char:
                return(string.Format("CHARACTER({0})", definition.Size));

            case GenericDbType.NChar:
                return(string.Format("NCHAR({0})", definition.Size));

            case GenericDbType.VarChar:
                return(string.Format("VARCHAR({0})", definition.Size));

            case GenericDbType.NVarchar:
                return(string.Format("NVARCHAR({0})", definition.Size));

            case GenericDbType.Text:
            case GenericDbType.NText:
                return("TEXT");

            case GenericDbType.SmallInt:
                return("SMALLINT");

            case GenericDbType.Int:
                return("INTEGER");

            case GenericDbType.BigInt:
                return("BIGINT");

            case GenericDbType.Money:
                return("DECIMAL(10,5)");

            case GenericDbType.Single:
                return("FLOAT");

            case GenericDbType.Double:
                return("DOUBLE");

            case GenericDbType.Boolean:
                return("BOOLEAN");

            case GenericDbType.Binary:
            case GenericDbType.VarBinary:
            case GenericDbType.Image:
                return("BLOB");

            case GenericDbType.Time:
                throw new NotSupportedException(string.Format("SQLite unsupported this type: {0}", definition.DataType));

            case GenericDbType.Date:
                return("DATE");

            case GenericDbType.DateTime:
                return("DATETIME");
            }
            return(string.Empty);
        }
コード例 #5
0
 /// <summary>
 /// 解析指定列定义的数据类型.
 /// </summary>
 /// <param name="definition">列定义信息.</param>
 /// <returns></returns>
 private string ParseDbType(DbTableColumnDefinition definition)
 {
     switch (definition.DataType)
     {
         case GenericDbType.Char:
         case GenericDbType.NChar:
             return string.Format("character({0})", definition.Size);
         case GenericDbType.VarChar:
         case GenericDbType.NVarchar:
             return string.Format("character varying({0})", definition.Size);
         case GenericDbType.Text:
         case GenericDbType.NText:
             return "text";
         case GenericDbType.SmallInt:
             return "smallint";
         case GenericDbType.Int:
             return "integer";
         case GenericDbType.BigInt:
             return "bigint";
         case GenericDbType.Money:
             return "decimal";
         case GenericDbType.Single:
             return "real";
         case GenericDbType.Double:
             return "double precision";
         case GenericDbType.Boolean:
             return "boolean";
         case GenericDbType.Binary:
         case GenericDbType.VarBinary:
         case GenericDbType.Image:
             return "bytea";
         case GenericDbType.Time:
             return (definition.Size > 0) ? string.Format("time({0})", definition.Size) : "TIME";
         case GenericDbType.Date:
             return "date";
         case GenericDbType.DateTime:
             return "timestamp";
     }
     return string.Empty;
 }
コード例 #6
0
        public TableCreateUnitTest()
        {
            // create table 命令构建.
            categoriesBuilder = new DbCommandBuilder();
            categoriesBuilder.CreateTable(table_categories).ColumnsDefine(
                DbTableColumnDefinition.New(name: "Id", dataType: GenericDbType.Int, notNull: true, identity: new DbColumnIdentity(0, 1), pk: true),
                DbTableColumnDefinition.New(name: "CategoryName", dataType: GenericDbType.VarChar, size: 255, notNull: true, unique: true),
                DbTableColumnDefinition.New(name: "Remark", dataType: GenericDbType.VarChar, size: 300),
                DbTableColumnDefinition.New(name: "Cover", dataType: GenericDbType.Image),
                DbTableColumnDefinition.New(name: "CreationDate", dataType: GenericDbType.DateTime, notNull: true, Default: Fun.Now())
                );

            productsBuilder = new DbCommandBuilder();
            productsBuilder.CreateTable(table_products).ColumnsDefine(
                DbTableColumnDefinition.New(name: "Id", dataType: GenericDbType.Int, notNull: true, identity: new DbColumnIdentity(0, 1), pk: true),
                DbTableColumnDefinition.New(name: "Category", dataType: GenericDbType.Int, notNull: true, fk: new DbForeignKey(table_categories, "Id")),
                DbTableColumnDefinition.New(name: "Name", dataType: GenericDbType.VarChar, size: 32, notNull: true, unique: true),
                DbTableColumnDefinition.New(name: "Price", dataType: GenericDbType.Single, Default: 0f),
                DbTableColumnDefinition.New(name: "Quantity", dataType: GenericDbType.SmallInt, Default: 0),
                DbTableColumnDefinition.New(name: "Remark", dataType: GenericDbType.VarChar, size: 300),
                DbTableColumnDefinition.New(name: "TimeOf", dataType: GenericDbType.DateTime, Default: Fun.Now()),
                DbTableColumnDefinition.New(name: "Picture", dataType: GenericDbType.Image)
                );
        }
コード例 #7
0
        /// <summary>
        /// 解释 CREATE TABLE 命令.
        /// </summary>
        /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
        /// <returns></returns>
        public override string Parsing(ref List <IDbDataParameter> DbParameters)
        {
            TableBuildDescription tableBuild = (TableBuildDescription)this.Description;
            StringBuilder         buffers    = new StringBuilder("CREATE TABLE ");
            StringBuilder         multiPk    = new StringBuilder();

            buffers.AppendFormat("{0}{1}{2} (", ElemIdentifierL, tableBuild.Name, ElemIdentifierR);
            string columnType = null;
            int    pk_count   = tableBuild.ColumnDefinitions.Count(def => def.PrimaryKey == true);
            DbTableColumnDefinition definition = null;

            for (int i = 0; i < tableBuild.ColumnDefinitions.Count; ++i)
            {
                definition = tableBuild.ColumnDefinitions[i];
                if (string.IsNullOrEmpty(definition.Name))
                {
                    throw new NoNullAllowedException("Undefined column name.");
                }
                columnType = ParseDbType(definition);
                if (string.IsNullOrEmpty(columnType))
                {
                    throw new NoNullAllowedException(string.Format("Type of undefined column: {0}", definition.Name));
                }
                buffers.AppendLine().AppendFormat("\t{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                buffers.AppendFormat(" {0} {1}", columnType, definition.NotNull ? "NOT NULL" : "NULL");
                if (definition.Unique)
                {
                    buffers.Append(" UNIQUE");
                }
                if (definition.Default != null)
                {
                    buffers.AppendFormat(" {0}", ParseDefaultValue(definition, ref DbParameters));
                }
                if (definition.PrimaryKey)
                {
                    if (pk_count > 1) // 联合主键判定.
                    {
                        if (multiPk.Length > 0)
                        {
                            multiPk.AppendFormat(",{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                        }
                        else
                        {
                            multiPk.AppendFormat("{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                        }
                    }
                    else
                    {
                        buffers.Append(" PRIMARY KEY");
                    }
                }
                if (definition.Identity != null)
                {
                    if (!definition.PrimaryKey)
                    {
                        throw new NotSupportedException(string.Format("AUTOINCREMENT can't be applied to non-primary key column: {0}", definition.Name));
                    }
                    if (pk_count > 1)
                    {
                        throw new NotSupportedException(string.Format("AUTOINCREMENT can't be applied to multi-primary key columns.", definition.Name));
                    }
                    buffers.Append(" AUTOINCREMENT");
                }
                if (definition.ForeignKey != null)
                {
                    ParseForeignKey(definition, buffers);
                }
                if (i < (tableBuild.ColumnDefinitions.Count - 1))
                {
                    buffers.Append(",");
                }
            }
            if (pk_count > 1)
            {
                buffers.Append(",").AppendLine().AppendFormat("\tPRIMARY KEY ({0})", multiPk.ToString());
            }
            buffers.AppendLine().Append(");");
            return(buffers.ToString());
        }
コード例 #8
0
 /// <summary>
 /// 解析列的外键设置.
 /// </summary>
 /// <param name="definition">列定义信息.</param>
 /// <param name="writer">将外键命令段写入该缓冲区.</param>
 /// <returns></returns>
 private void ParseForeignKey(DbTableColumnDefinition definition, StringBuilder writer)
 {
     writer.AppendFormat(" REFERENCES {0}{1}{2}", ElemIdentifierL, definition.ForeignKey.Table, ElemIdentifierR);
     writer.AppendFormat(" ({0}{1}{2})", ElemIdentifierL, definition.ForeignKey.Column, ElemIdentifierR);
     writer.AppendFormat(" ON DELETE {0} ON UPDATE {1}", definition.ForeignKey.OnDelete, definition.ForeignKey.OnUpdate);
 }
コード例 #9
0
        /// <summary>
        /// 解释 CREATE TABLE 命令.
        /// </summary>
        /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
        /// <returns></returns>
        public override string Parsing(ref List <IDbDataParameter> DbParameters)
        {
            TableBuildDescription tableBuild = (TableBuildDescription)this.Description;
            StringBuilder         buffers    = new StringBuilder("CREATE TABLE ");
            StringBuilder         multiPk    = new StringBuilder();
            StringBuilder         fkBuffers  = new StringBuilder();

            buffers.AppendFormat("{0}{1}{2} (", ElemIdentifierL, tableBuild.Name, ElemIdentifierR);
            string columnType = null;
            int    pk_count   = tableBuild.ColumnDefinitions.Count(def => def.PrimaryKey == true);
            DbTableColumnDefinition definition = null;
            DbColumnIdentity        identity   = null;

            for (int i = 0; i < tableBuild.ColumnDefinitions.Count; ++i)
            {
                definition = tableBuild.ColumnDefinitions[i];
                if (string.IsNullOrEmpty(definition.Name))
                {
                    throw new NoNullAllowedException("Undefined column name.");
                }
                columnType = ParseDbType(definition);
                if (string.IsNullOrEmpty(columnType))
                {
                    throw new NoNullAllowedException(string.Format("Type of undefined column: {0}", definition.Name));
                }
                buffers.AppendLine();
                buffers.AppendFormat("\t{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                buffers.AppendFormat(" {0} {1}", columnType, definition.NotNull ? "NOT NULL" : "NULL");
                if (definition.Default != null)
                {
                    buffers.AppendFormat(" {0}", ParseDefaultValue(definition, ref DbParameters));
                }
                if (definition.Identity != null)
                {
                    identity = definition.Identity;
                    buffers.Append(" AUTO_INCREMENT");
                }
                if (definition.Unique)
                {
                    buffers.Append(" UNIQUE");
                }
                if (definition.PrimaryKey)
                {
                    if (pk_count > 1) // 联合主键判定.
                    {
                        if (multiPk.Length > 0)
                        {
                            multiPk.AppendFormat(",{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                        }
                        else
                        {
                            multiPk.AppendFormat("{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
                        }
                    }
                    else
                    {
                        buffers.Append(" PRIMARY KEY");
                    }
                }
                if (definition.ForeignKey != null)
                {
                    ParseForeignKey(tableBuild.Name, definition, fkBuffers);
                }
                if (i < (tableBuild.ColumnDefinitions.Count - 1))
                {
                    buffers.Append(",");
                }
            }
            if (pk_count > 1)
            {
                buffers.Append(",").AppendLine();
                buffers.AppendFormat("\tPRIMARY KEY ({0})", multiPk.ToString());
            }
            if (fkBuffers.Length > 0)
            {
                buffers.Append(",").AppendLine().Append(fkBuffers.ToString());
            }
            buffers.AppendLine();
            buffers.AppendFormat(") ENGINE={0} AUTO_INCREMENT={1} DEFAULT CHARSET=utf8;", ((MySqlParserAdapter)Adapter).MysqlEngine, identity.InitValue);
            return(buffers.ToString());
        }
コード例 #10
0
        /// <summary>
        /// 解析指定列定义的数据类型.
        /// </summary>
        /// <param name="definition">列定义信息.</param>
        /// <returns></returns>
        private string ParseDbType(DbTableColumnDefinition definition)
        {
            switch (definition.DataType)
            {
            case GenericDbType.Char:
                return(string.Format("CHAR({0})", definition.Size));

            case GenericDbType.NChar:
                return(string.Format("NCHAR({0})", definition.Size));

            case GenericDbType.VarChar:
                return(string.Format("VARCHAR({0})", definition.Size));

            case GenericDbType.NVarchar:
                return(string.Format("NVARCHAR({0})", definition.Size));

            case GenericDbType.Text:
                return("TEXT");

            case GenericDbType.NText:
                return("NTEXT");

            case GenericDbType.SmallInt:
                return("SMALLINT");

            case GenericDbType.Int:
                return("INT");

            case GenericDbType.BigInt:
                return("BIGINT");

            case GenericDbType.Money:
                return("MONEY");

            case GenericDbType.Single:
                return("FLOAT");

            case GenericDbType.Double:
                return("DOUBLE");

            case GenericDbType.Boolean:
                return("BIT");

            case GenericDbType.Binary:
                return(string.Format("BINARY({0})", definition.Size));

            case GenericDbType.VarBinary:
                return(string.Format("VARBINARY({0})", definition.Size));

            case GenericDbType.Image:
                return("IMAGE");

            case GenericDbType.Time:
                return((definition.Size > 0) ? string.Format("TIME({0})", definition.Size) : "TIME");

            case GenericDbType.Date:
                return("DATE");

            case GenericDbType.DateTime:
                return("DATETIME");
            }
            return(string.Empty);
        }
コード例 #11
0
 /// <summary>
 /// 解释 CREATE TABLE 命令.
 /// </summary>
 /// <param name="DbParameters">用于缓存在解释过程中可能会产生的参数。</param>
 /// <returns></returns>
 public override string Parsing(ref List<IDbDataParameter> DbParameters)
 {
     TableBuildDescription tableBuild = (TableBuildDescription)this.Description;
     StringBuilder tableBuffers = new StringBuilder("CREATE TABLE ");
     StringBuilder sequnceBuffers = new StringBuilder();
     StringBuilder pkBuffers = new StringBuilder();
     StringBuilder uniqueBuffers = new StringBuilder();
     StringBuilder fkBuffers = new StringBuilder();
     tableBuffers.AppendFormat("{0}{1}{2} (", ElemIdentifierL, tableBuild.Name, ElemIdentifierR);
     string columnType = null, seqName = null;
     DbTableColumnDefinition definition = null;
     for (int i = 0; i < tableBuild.ColumnDefinitions.Count; ++i)
     {
         definition = tableBuild.ColumnDefinitions[i];
         if (string.IsNullOrEmpty(definition.Name))
             throw new NoNullAllowedException("Undefined column name.");
         columnType = ParseDbType(definition);
         if (string.IsNullOrEmpty(columnType))
             throw new NoNullAllowedException(string.Format("Type of undefined column: {0}", definition.Name));
         tableBuffers.AppendLine().AppendFormat("\t{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
         tableBuffers.AppendFormat(" {0} {1}", columnType, definition.NotNull ? "NOT NULL" : "NULL");
         if (definition.Default != null && definition.Identity == null)
             tableBuffers.AppendFormat(" {0}", ParseDefaultValue(definition, ref DbParameters));
         if (definition.Identity != null)
         {
             seqName = string.Format("{0}_{1}_seq", tableBuild.Name, definition.Name);
             AddSequnce(definition.Identity, seqName, sequnceBuffers);
             tableBuffers.AppendFormat(" DEFAULT nextval('{0}{1}{2}'::regclass)", ElemIdentifierL, seqName, ElemIdentifierR);
         }
         if (definition.Unique)
         {
             if (uniqueBuffers.Length > 0)
                 uniqueBuffers.AppendFormat(",{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
             else
                 uniqueBuffers.AppendFormat("{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
         }
         if (definition.PrimaryKey)
         {
             if (pkBuffers.Length > 0)
                 pkBuffers.AppendFormat(",{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
             else
                 pkBuffers.AppendFormat("{0}{1}{2}", ElemIdentifierL, definition.Name, ElemIdentifierR);
         }
         if (definition.ForeignKey != null)
             ParseForeignKey(tableBuild.Name, definition, fkBuffers);
         if (i < (tableBuild.ColumnDefinitions.Count - 1))
             tableBuffers.Append(",");
     }
     if (pkBuffers.Length > 0)
     {
         tableBuffers.Append(",").AppendLine();
         tableBuffers.AppendFormat("\tCONSTRAINT {0}PK_{1}{2}", ElemIdentifierL, tableBuild.Name, ElemIdentifierR);
         tableBuffers.AppendFormat(" PRIMARY KEY ({0})", pkBuffers.ToString());
     }
     if (uniqueBuffers.Length > 0)
     {
         tableBuffers.Append(",").AppendLine();
         tableBuffers.AppendFormat("\tCONSTRAINT {0}UK_{1}_UNIQUE{2}", ElemIdentifierL, tableBuild.Name, ElemIdentifierR);
         tableBuffers.AppendFormat(" UNIQUE ({0})", uniqueBuffers.ToString());
     }
     if (fkBuffers.Length > 0)
         tableBuffers.Append(",").AppendLine().Append(fkBuffers.ToString());
     tableBuffers.AppendLine().Append(");");
     return sequnceBuffers.AppendLine().Append(tableBuffers.ToString()).ToString();
 }