Beispiel #1
0
            /// <summary>
            /// Generates SQL for creating this table.
            /// </summary>
            /// <param name="dialect"></param>
            /// <param name="defaultCatalog">the default catalog name</param>
            /// <param name="defaultSchema">the default schema name</param>
            /// <returns>an SQL string</returns>
            public String ToSqlCreate(Dialect dialect, String defaultCatalog, String defaultSchema)
            {
                StringBuilder sb = StringHelper.CreateBuilder()
                    .Append(HasPrimaryKey ? dialect.CreateTableString : dialect.CreateMultisetTableString)
                    .Append(" ")
                    .Append(GetQualifiedName(dialect, defaultCatalog, defaultSchema))
                    .Append(" (");
                Boolean hasIdentity = false;

                StringHelper.AppendItemsWithComma(Columns, delegate(Column column)
                {
                    // column info
                    sb.Append(column.GetQuotedName(dialect))
                        .Append(" ");

                    if (column.DbType == DbType.Identity)
                    {
                        hasIdentity = true;
                        if (dialect.HasDataTypeInIdentityColumn)
                            sb.Append(column.GetSqlType(dialect));
                        sb.Append(" ").Append(dialect.IdentityColumnString);
                    }
                    else
                    {
                        sb.Append(column.GetSqlType(dialect));

                        if (column.DefaultValue != null)
                            sb.Append(" DEFAULT ").Append(column.DefaultValue);

                        if (column.Nullable)
                            sb.Append(dialect.NullColumnString);
                        else
                            sb.Append(" NOT NULL");
                    }

                    // unique constraint
                    if (column.Unique &&
                        (!column.Nullable || dialect.SupportsNullableUnique))
                    {
                        if (dialect.SupportsUnique)
                            sb.Append(" UNIQUE");
                        else
                        {
                            UniqueKey uk = GetOrCreateUniqueKey(column.GetQuotedName(dialect) + "_");
                            uk.AddColumn(column);
                        }
                    }

                    // check constraint
                    if (column.CheckConstraint != null && dialect.SupportsColumnCheck)
                        sb.Append(" CHECK (")
                            .Append(column.CheckConstraint)
                            .Append(")");

                    // comment
                    if (column.Comment != null)
                        sb.Append(dialect.GetColumnComment(column.Comment));
                }, sb);

                if (HasPrimaryKey && !(hasIdentity && dialect.HasPrimaryKeyInIdentityColumn))
                    sb.Append(", ")
                        .Append(PrimaryKey.ToSqlConstraintString(dialect));

                if (dialect.SupportsUniqueConstraintInCreateAlterTable)
                {
                    foreach (UniqueKey uk in _uniqueKeys.Values)
                    {
                        String constraint = uk.ToSqlConstraintString(dialect);
                        if (!String.IsNullOrEmpty(constraint))
                            sb.Append(", ").Append(constraint);
                    }
                }

                // table check
                if (dialect.SupportsTableCheck)
                {
                    foreach (String check in _checkConstraints)
                    {
                        sb.Append(", CHECK (").Append(check).Append(")");
                    }
                }

                sb.Append(")");

                if (Comment != null)
                {
                    sb.Append(dialect.GetTableComment(Comment));
                }

                return sb.ToString();
            }