/// <summary>
 /// 添加一个自增长序列.
 /// </summary>
 /// <param name="identity">自增长的设置信息.</param>
 /// <param name="seq_name">自增长序列的名称.</param>
 /// <param name="writer">自增长序列生成到该缓冲区.</param>
 private void AddSequnce(DbColumnIdentity identity, string seq_name, StringBuilder writer)
 {
     if (writer.Length > 0)
         writer.AppendLine();
     writer.AppendFormat("CREATE SEQUENCE {0}{1}{2}", ElemIdentifierL, seq_name, ElemIdentifierR).AppendLine();
     writer.AppendFormat("\tINCREMENT {0} ", identity.Increment).AppendLine();
     writer.AppendFormat("\tSTART {0}", identity.InitValue).AppendLine();
     writer.AppendFormat("\tMINVALUE {0}", identity.InitValue).AppendLine();
     writer.Append("\tCACHE 1;");
 }
        /// <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());
        }