2008-10-21 9 views
9

Hệ thống web VB.net với chương trình phụ trợ SQL Server 2005. Tôi đã có một thủ tục lưu trữ trả về một varchar, và cuối cùng chúng tôi nhận được các giá trị mà sẽ không phù hợp trong một varchar (8000).Tôi có thể trả về một varchar (max) từ một thủ tục lưu sẵn không?

Tôi đã thay đổi tham số trả về thành một varchar (max), nhưng làm cách nào để cho thuộc tính OleDbParameter.Size chấp nhận bất kỳ số lượng văn bản nào?

Là một ví dụ cụ thể, mã VB mà có các thông số trở về từ thủ tục lưu trữ sử dụng để trông giống như:

objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar) 
objOutParam1.Size = 8000 
objOutParam1.Direction = ParameterDirection.Output 

tôi có thể làm gì .Size để làm việc với một (max)?

Cập nhật:

Để trả lời một số câu hỏi:

Đối với tất cả các tính năng, văn bản này, tất cả cần phải đi ra như một đoạn. (Thay đổi đó sẽ mất nhiều công việc kết cấu hơn tôi muốn làm - hoặc được ủy quyền thực sự.)

Nếu tôi không đặt kích thước, tôi gặp lỗi "Chuỗi [6]: Thuộc tính Kích thước có kích thước không hợp lệ là 0. "

Trả lời

8

upvoted Ed Altofer. (Anh ta trả lời trước, vì vậy nếu bạn thích câu trả lời của tôi cũng bình chọn).

OleDb là vấn đề của bạn. Đó là một kết nối cơ sở dữ liệu chung mà cần phải nói chuyện với nhiều hơn là chỉ SQL Server, và kết quả là bạn có một tình huống mẫu số chung thấp nhất, nơi chỉ có tập hợp tính năng tổng hợp yếu nhất có thể được hỗ trợ đầy đủ. Một trong những tính năng bị mất là hỗ trợ varchar (max).

Bạn đang sử dụng SQL Server 2005 và VB.Net. Điều gì ngăn cản bạn sử dụng System.Data.SqlClient thay vì System.Data.OleDb?

Chỉnh sửa
Tôi đã tìm thấy tài liệu về vấn đề này. Xem ở đây:
http://msdn.microsoft.com/en-us/library/ms131035.aspx

Phần liên quan:

giá trị trở lại của kiểu dữ liệu varchar (max), nvarchar (max), varbinary (max), xml, UDT, hoặc đối tượng lớn khác loại không thể được trả về cho các phiên bản máy khách sớm hơn SQL Server 2005. Nếu bạn muốn sử dụng các kiểu này làm giá trị trả về, bạn phải sử dụng SQL Server Native Client.

+1

Thành thật mà nói - sếp của tôi. Toàn bộ hệ thống được xây dựng dựa trên kết nối OleDB, và tôi phải sống với nó. Tin tôi đi, nếu tôi là kiến ​​trúc sư này, tôi sẽ được tất cả các phiên bản tốt hơn. (Tất nhiên, nếu tôi chịu trách nhiệm, sproc tôi đang cố gắng sửa chữa thậm chí sẽ không tồn tại ...) –

0

Chuỗi lớn này trông như thế nào? Có lẽ đó là một cái gì đó có thể được trả lại tốt hơn thông qua một bộ hồ sơ bổ sung, hoặc là nó chỉ là văn bản lưu ý?

1

Bạn đã cố gắng không chỉ định kích thước?
Bạn có thể trả lại TEXT thay vì VARCHAR (MAX) không?

+0

Không chỉ định kích thước sẽ phát ra lỗi khác. Trả về văn bản thất bại vì một vài lý do - nó không được chấp nhận, SQL2005 dường như không muốn truyền giữa varchar và văn bản - và nó chống lại chính sách của corp để sử dụng TEXT. –

8

Bạn có thể sử dụng ADO.NET không?

Chỉnh sửa: Để làm rõ, tôi chỉ gợi ý rằng bạn có thể muốn xem xét ADO.NET vì bạn đang làm việc với VB.NET 2005 và SQL Server 2005 - OLEDB là cách truy cập trước. cơ sở dữ liệu, vì vậy bạn có thể tìm thấy sự linh hoạt hơn bằng cách sử dụng ADO.NET thay thế.

Bạn không nên trả về VARCHAR từ quy trình được lưu trữ. Tôi thậm chí không chắc chắn bạn có thể.

Tuy nhiên, nếu bạn sử dụng tham số OUT, bạn không cần phải chỉ định kích thước theo kích thước. Ví dụ:

SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar); 
p.Direction = ParameterDirection.Output; 

Không chắc chắn điều này có phù hợp với nhu cầu của bạn hay không, nhưng nó chỉ hoạt động tốt.

+0

OleDb chỉ hỗ trợ lên đến VARCHAR (8000), vì vậy đây chính xác là nguyên nhân của sự cố. –

+0

Joel - bạn chắc chắn đã bắt gặp một hạn chế của OleDb mà tôi không biết. Rất tốt. –

0

Bạn đã cố gắng xác định:

objOutParam1.Size = Int32.MaxValue; 
+0

Có. Kiểu trả về varchar được chỉ định trong hàm tạo tham số giới hạn giá trị trả về cho 8000 ký tự đầu tiên.Có vẻ như không phải là loại trả về varchar (max). (?) –

-1

Câu trả lời ngắn gọn là sử dụng TEXT thay vì VARCHAR (tối đa). 8K là kích thước tối đa của trang cơ sở dữ liệu, nơi tất cả các cột dữ liệu của bạn phải phù hợp với ngoại trừ BLOB và TEXT. Có nghĩa là, dung lượng có sẵn của bạn nhỏ hơn 8k vì các cột khác của bạn.

BLOB và TEXT là Web 1.0. Hàng lớn hơn có nghĩa là thời gian sao chép cơ sở dữ liệu lớn hơn và tệp I/O lớn hơn. Tôi đề nghị bạn duy trì một máy chủ tập tin riêng biệt với một giao diện HTTP cho điều đó.

Và, cho cột trước

DataUrl VARCHAR (255) NOT NULL,

Khi chèn một hàng mới, lần đầu tiên tính toán MD5 checksum của dữ liệu. Thứ hai, tải dữ liệu lên máy chủ tệp bằng tổng kiểm tra làm tên tệp. Thứ ba, INSERT INTO ... (..., DataUrl) VALUES (..., "http://fileserver/get?id=". Md5_checksum_data)

Với thiết kế này, cơ sở dữ liệu của bạn sẽ giữ bình tĩnh ngay cả khi kích thước dữ liệu trung bình trở thành 1000x.

+0

Điều này là không đúng. varchar (max) được lưu trữ bên ngoài hàng nếu dữ liệu đủ dài. – erikkallen

+0

Cũng nên đề cập đến các loại dữ liệu TEXT và IMAGE không được chấp nhận. Không có thứ như BLOB trong SQL Server (nó được gọi là Image hoặc varbinary (max)). – erikkallen

+0

TEXT không được chấp nhận trong SQL Server 2005? Tôi không biết điều đó. Bạn có thể chia sẻ nguồn không? – yogman

0

Chỉ cần sử dụng int.MaxValue cho kích thước tham số. Byte [] ra khỏi sproc sẽ có độ dài chính xác. (Tôi là acutally sử dụng varbinary nhưng kết quả sẽ giống nhau).

param.Size = int.MaxValue; 
param.SqlDbType = SqlDbType.VarBinary; 
0

Bạn đã thử với "OleDbType.LongVarChar", loại này bản đồ sang Text trong SQL server 2K, và cho phép bạn lấy hơn 8K ký tự.

4

Tôi nghĩ rằng việc sử dụng -1 cho kích thước sẽ hoạt động. Ít nhất nó nên với ADO.NET. Như thế này:

objOutParam1 = objCommand.Parameters.Add ("@ RStr", OleDbType.varchar, -1)

Đây là một bài viết dài, nhưng nó cho thấy sử dụng -1 trong ví dụ cuối cùng:

http://msdn.microsoft.com/en-us/library/bb399384.aspx

0

Tùy chọn -1 hoạt động khá tốt. Tôi sử dụng nó trong một số trường hợp, nơi tôi có một varchar (tối đa) trở lại từ một proc được lưu trữ.