/// <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()); }