2011-08-15 22 views
5

Sử dụng NHibernate 3.1 với cả SQL Server và Oracle DBs, chúng tôi cần lưu trữ chuỗi văn bản dài hơn 4000 ký tự. Văn bản thực sự là XML, nhưng điều đó không quan trọng - chúng tôi chỉ muốn coi nó là văn bản thô. Với SQL Server, điều này rất dễ dàng. Chúng tôi khai báo cột này là NVARCHAR (MAX) và ánh xạ nó như sau:Lập bản đồ chuỗi văn bản dài trong Oracle và NHibernate

<property name="MyLongTextValue" length="100000"/> 

Việc sử dụng thuộc tính độ dài cho NHibernate mong đợi một chuỗi dài hơn 4000 ký tự.

Đối với cuộc sống của tôi, tôi không thể tìm ra cách để thực hiện công việc này trên Oracle 11g. Tôi đã cố gắng tuyên bố cột là cả XMLTYPE và LONG không thành công. Trong trường hợp đầu tiên, chúng tôi kết thúc với ORA-01461: chỉ có thể ràng buộc giá trị DÀI để chèn vào cột DÀI khi cố chèn hàng. Trong trường hợp thứ hai, dữ liệu được chèn chính xác nhưng trở lại như một chuỗi rỗng khi truy vấn.

Có ai biết cách thực hiện tác phẩm này không? Câu trả lời phải tương thích với cả SQL Server và Oracle. Tôi không muốn viết các phần mở rộng tùy chỉnh như các kiểu người dùng và các lớp con của trình điều khiển. Cảm ơn.

+0

Bạn nên sử dụng NTEXT cho máy chủ sql, NVARCHAR (MAX) sẽ không có khả năng xử lý nhiều hơn 4000 ký tự. –

+0

@YavorShahpasov tại sao bạn nghĩ rằng NVARCHAR (MAX) sẽ không xử lý hơn 4000 ký tự? Các tài liệu nói "tối đa cho biết kích thước lưu trữ tối đa là 2^31-1 byte (2 GB)". Đó là đủ cho 1073741823 ký tự hoặc hơn. – phoog

+0

Tôi đã bị lừa bởi thực tế là nó cho phép 1-4000 ký tự. Bạn là chính xác và tối đa sẽ cho phép tối đa 2GB. –

Trả lời

6

Bạn nên sử dụng một cái gì đó như thế này

<property name="MyLongTextValue" length="100000" type="StringClob" 
not-null="false"/> 

này nên làm việc với kiểu CLOB Oracle và SQLServer loại NTEXT.

Hãy chắc chắn rằng các tài sản trên mô hình của bạn là nullable

public virtual string MyLongTextValue {get;set;} 

Bạn nên luôn luôn sử dụng Oracle.DataAccess khi giao dịch với CLOBs

0

Bạn có thể quan tâm article này.

<property column="`LARGE_STRING`" name="LargeString" type="StringClob" sql-type="NCLOB" /> 
2

Đối với người này có thể quan tâm, tôi giải quyết vấn đề của tôi sau khi bước 3 của this article:

3. Sử dụng bản đồ đúng thuộc tính: type="AnsiString"

Thông thường chúng ta có thể sử dụng type="String" mặc định cho CLOB/NCLOB. Hãy thử sử dụng>type="AnsiString" nếu hai bước trên không hoạt động.

<property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/>

Trong trường hợp của tôi, tôi đặt nó với FluentNHibernate:

.CustomType("AnsiString") 
Các vấn đề liên quan