使用varchar(max)而不是varchar(8000)创建列

时间:2013-06-20 11:51:24

标签: ormlite-servicestack

如何在表中创建列并在使用servicestack ormlite时将其指定为varchar(max)?

目前我在创建表后执行一些sql以获得我想要的内容。 我已经看过StringLength属性,但想知道是否有更好的方法呢?

这样的东西
StringLength(Sql.VarcharMax)

由于

4 个答案:

答案 0 :(得分:3)

通过执行以下操作解决了这个问题

 if (!db.TableExists(typeof(Entity).Name))
 {
   db.CreateTableIfNotExists<Entity>();
   db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
 }

答案 1 :(得分:2)

使用System.ComponentModel.DataAnnotations.StringLengthAttribute

装饰您的域模型

,例如

[StringLengthAttribute(8001)]
public string Markdown { get;set; }

[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }

使用大于8000的任何长度超过需要varchar声明的Sql Server nvarchar / MAX列类型的最大长度。

使用自定义方言提供程序,了解MAX声明。

public class MaxSqlProvider : SqlServerOrmLiteDialectProvider
{
  public new static readonly MaxSqlProvider Instance = new MaxSqlProvider ();

  public override string GetColumnDefinition(string fieldName, Type fieldType, 
            bool isPrimaryKey, bool autoIncrement, bool isNullable, 
            int? fieldLength, int? scale, string defaultValue)
  {
     var fieldDefinition = base.GetColumnDefinition(fieldName, fieldType,
                                    isPrimaryKey, autoIncrement, isNullable, 
                                    fieldLength, scale, defaultValue);

     if (fieldType == typeof (string) && fieldLength > 8000)
     {
       var orig = string.Format(StringLengthColumnDefinitionFormat, fieldLength);
       var max = string.Format(StringLengthColumnDefinitionFormat, "MAX");

       fieldDefinition = fieldDefinition.Replace(orig, max);
     }

     return fieldDefinition;
  }
}

在构建数据库工厂时使用提供程序

var dbFactory = new OrmLiteConnectionFactory(conStr, MaxSqlProvider.Instance);

请注意,此插图专门针对SqlServer,但在从所需提供程序继承之后,它与其他数据提供程序相关,但会有轻微的更改。

答案 2 :(得分:1)

ServiceStack似乎已通过一项功能来解决此问题,以进一步自定义字段的创建类型,请参阅:https://github.com/ServiceStack/ServiceStack.OrmLite#custom-field-declarations

或详见该链接:

  

[CustomField]属性可用于在生成的Create table DDL语句中指定自定义字段声明,例如:

public class PocoTable
{
    public int Id { get; set; }

    [CustomField("CHAR(20)")]
    public string CharColumn { get; set; }

    [CustomField("DECIMAL(18,4)")]
    public decimal? DecimalColumn { get; set; }
}

其中

db.CreateTable<PocoTable>(); 

生成并执行以下SQL:

CREATE TABLE "PocoTable" 
(
  "Id" INTEGER PRIMARY KEY, 
  "CharColumn" CHAR(20) NULL, 
  "DecimalColumn" DECIMAL(18,4) NULL 
);  

然而,根据我的评论o之前的答案之一,我猜测这可能是特定于数据库的,抱歉,我无法轻松访问多个数据库服务器去测试。

答案 3 :(得分:1)

可以使用OrmLite's Type Converters来控制每种类型的列定义,默认SqlServerStringConvertersVARCHAR(MAX)用于[StringLength(StringLengthAttribute.MaxText)]归属的属性,例如:

public class PocoTable
{
    public int Id { get; set; }

    [StringLength(StringLengthAttribute.MaxText)]
    public string MaxText { get; set; }

    [StringLength(256)]
    public string SmallText { get; set; }
}

使用StringLengthAttribute.MaxText(或其别名int.MaxValue)将自动使用最合适的数据类型在每个RDBMS中存储大字符串。