首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用varchar(max)而不是varchar(8000)创建列

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

Stack Overflow用户
提问于 2013-06-20 19:51:24
回答 4查看 2.8K关注 0票数 11

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

目前,我在表创建之后执行一些sql来获得我想要的东西。我看过StringLength属性,但想知道有没有更好的方法?

就像这样

代码语言:javascript
复制
StringLength(Sql.VarcharMax)

谢谢

EN

回答 4

Stack Overflow用户

发布于 2013-06-29 02:34:27

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

代码语言:javascript
复制
 if (!db.TableExists(typeof(Entity).Name))
 {
   db.CreateTableIfNotExists<Entity>();
   db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
 }
票数 3
EN

Stack Overflow用户

发布于 2014-09-09 01:12:18

System.ComponentModel.DataAnnotations.StringLengthAttribute修饰你的域模型

比如

代码语言:javascript
复制
[StringLengthAttribute(8001)]
public string Markdown { get;set; }

代码语言:javascript
复制
[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }

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

使用能够理解MAX声明的自定义方言提供程序。

代码语言:javascript
复制
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;
  }
}

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

代码语言:javascript
复制
var dbFactory = new OrmLiteConnectionFactory(conStr, MaxSqlProvider.Instance);

注此图专门针对SqlServer,但它与继承自所需提供程序后稍有更改的其他数据提供程序相关。

票数 2
EN

Stack Overflow用户

发布于 2016-11-29 03:32:36

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

或在该链接中详细说明:

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

代码语言:javascript
复制
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; }
}

哪里

代码语言:javascript
复制
db.CreateTable<PocoTable>(); 

生成并执行以下SQL:

代码语言:javascript
复制
CREATE TABLE "PocoTable" 
(
  "Id" INTEGER PRIMARY KEY, 
  "CharColumn" CHAR(20) NULL, 
  "DecimalColumn" DECIMAL(18,4) NULL 
);  

但是,根据我对先前答案之一的评论,我猜这可能是特定于db的,对不起,我无法轻松访问多个db服务器进行测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17212917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档