2013-06-20 43 views
10

Làm cách nào để tạo cột trong bảng và chỉ định cột đó bằng varchar (max) khi sử dụng servicestack hoặcmlite?Tạo cột với varchar (tối đa) thay vì varchar (8000)

Hiện tại tôi thực hiện một số sql sau khi tạo bảng để có được những gì tôi muốn. Tôi đã nhìn thấy các thuộc tính StringLength nhưng đã tự hỏi nếu có một cách đẹp hơn để làm điều đó?

Something như

StringLength(Sql.VarcharMax) 

Cảm ơn

+0

Ở đây bạn có thêm chi tiết [ntext-in-servicestack-ormlite] [1] [1]: http://stackoverflow.com/questions/11281726/ntext-in-servicestack-ormlite –

+0

Tôi sẽ quan tâm đến lý do đằng sau việc sử dụng StringColumnDefinition = UseUnicode? "NVARCHAR (4000)": "VARCHAR (8000)"; – mosesfetters

+0

@FettMo Nếu bạn có nghĩa là lý do tại sao 4000 & 8000 - trường varchar trong SQL Server Express được tối đa là 8000 (trừ khi bạn sử dụng tối đa). nvarchar là lớn gấp đôi như vôn vì vậy nó maxed tại 4000. – kape123

Trả lời

3

Làm việc xung quanh vấn đề này bằng cách làm như sau

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

Tôi thích câu trả lời này, nhưng nó có thể có giá trị chỉ ra rằng đây là MS SQL cụ thể, không? –

2

Trang trí mô hình tên miền của bạn với System.ComponentModel.DataAnnotations.StringLengthAttribute

như

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

hoặc

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

sử dụng bất kỳ chiều dài lớn hơn 8000 vượt quá chiều dài tối đa của Sql Server varchar/nvarchar loại cột mà yêu cầu tuyên bố MAX.

Sử dụng nhà cung cấp phương ngữ tùy chỉnh để hiểu tờ khai 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; 
    } 
} 

Sử dụng các nhà cung cấp khi bạn xây dựng nhà máy sản xuất cơ sở dữ liệu

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

Note minh họa này được đặc biệt nhắm mục tiêu SQLServer nhưng nó sẽ có liên quan cho các nhà cung cấp dữ liệu khác với thay đổi nhỏ sau khi kế thừa từ các nhà cung cấp mong muốn.

1

Dường như ServiceStack đã giải quyết điều này với một tính năng để tùy chỉnh thêm các loại tạo ra các lĩnh vực, xem: https://github.com/ServiceStack/ServiceStack.OrmLite#custom-field-declarations

hoặc chi tiết tại liên kết:

Các [CustomField] thuộc tính có thể sử dụng để xác định tờ khai lĩnh vực tùy chỉnh trong các câu lệnh DDL bảng tạo Tạo, ví dụ:

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; } 
} 

đâu

db.CreateTable<PocoTable>(); 

Tạo và thực thi các lệnh SQL sau:

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

Mặc dù vậy, theo nhận xét của tôi o một trong những câu trả lời trước, tôi đoán rằng đây có lẽ là db cụ thể, xin lỗi, tôi không có quyền truy cập dễ dàng vào một số máy chủ db để kiểm tra.

+0

FYI Ngoài ra [xem câu trả lời của tôi] (http://stackoverflow.com/a/40852209/85785), nơi bạn cũng có thể sử dụng [Trình chuyển đổi loại tùy chỉnh] (https://github.com/ServiceStack/ServiceStack.OrmLite/ wiki/OrmLite-Type-Converters) để sửa đổi các định nghĩa Cột cho mỗi kiểu dữ liệu cho mỗi RDBMS. – mythz

1

Định nghĩa cột của từng loại có thể được điều khiển bằng OrmLite's Type Converters nơi mặc định SqlServerStringConverters sẽ sử dụng VARCHAR(MAX) đối với tài sản do với [StringLength(StringLengthAttribute.MaxText)], ví dụ:

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

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

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

Sử dụng StringLengthAttribute.MaxText (hoặc bí danh của nó int.MaxValue) sẽ tự động sử dụng nhiều nhất datatype thích hợp để lưu trữ các chuỗi lớn trong mỗi RDBMS.

Các vấn đề liên quan