2009-02-26 25 views
9

Tôi đã có một dự án SQLServer với một thử nghiệm rất đơn giản cho một bảng giá trị-Chức năng: -SqlFunction thất bại trong việc mở kết nối bối cảnh bất chấp DataAccessKind.Read hiện

[SqlFunction(TableDefinition = "forename nvarchar(50)", FillRowMethodName = "TestFillRow", DataAccess = DataAccessKind.Read)] 
public static IEnumerable TestConn(int ID) 
{ 
    using (SqlConnection con = new SqlConnection("context connection=true")) 
    { 
     //con.Open(); 
     yield return "Anthony"; 
    } 
} 

public static void TestFillRow(object obj, out string forename) 
{ 
    forename = (string)obj; 
} 

Note Open vào kết nối hiện đang Bình luận. Sau khi triển khai, tôi có thể thực hiện như thế này trong SQL: -

SELECT * FROM [dbo].[TestConn](1) 

Tất cả đều hoạt động tốt.

Bây giờ tôi bỏ ghi chú con.open() và nó không thành công với: -

truy cập dữ liệu không được phép trong bối cảnh này. Dù bối cảnh là một chức năng hoặc phương pháp không được đánh dấu với DataAccessKind.Read hoặc SystemDataAccessKind.Read, là một callback để có được dữ liệu từ FillRow phương pháp của một Bảng Quý Chức năng, hoặc là một phương pháp xác nhận UDT.

Tôi không thấy vấn đề là gì, chức năng TestConn có DataAccessKind.Read.

Bất kỳ ai biết về bất kỳ lý do nào khác để nhận lỗi này?

Trả lời

12

Vấn đề là như sau:

  1. SQLCLR không cho phép bất kỳ truy cập dữ liệu bên trong TestFillRow

  2. Mặc dù nó "có vẻ" như truy cập dữ liệu TestFillRow doesnt của bạn, cách trình biên dịch chuyển hóa những mã với câu lệnh "yield" là thực sự trì hoãn việc thực hiện nó cho đến khi cuộc gọi .MoveNext() đầu tiên tới trình vòng lặp. Do đó, tuyên bố sau:

    using (SqlConnection con = new SqlConnection("context connection=true"))   
    

    được thực thi bên trong TestFillRow ... bất hợp pháp.

Không sử dụng lợi tức lợi nhuận; thay vì tải toàn bộ kết quả vào một số List<> và trả về danh sách ở cuối hàm UD.

+0

Một sự chấp nhận rất quan trọng và nâng cao, (nhắc tôi xấu hổ khi nói bằng cách bỏ phiếu xuống câu hỏi của tôi). Bạn hoàn toàn đúng không có gì chạy cho đến khi Movenext. Tôi thậm chí còn viết blog về hành vi này bản thân mình ở đây: - http://geekswithblogs.net/codingbloke/archive/2010/09/12/simple-asynchronous-operation-runner-ndash-part-1.aspx nhưng tôi rõ ràng didn ' t thấy kết nối giữa chúng cho đến bây giờ. – AnthonyWJones

+0

Xem lỗi Kết nối liên quan đến các giới hạn của FillRow: http://connect.microsoft.com/SQLServer/feedback/details/442200/sql-server-2008-clr-tvf-data-access-limitations-break-existing-code – piers7

+2

Đó là không phải là vấn đề mà kết nối * mở * bên trong 'TestFillRow'.Thậm chí nếu bạn cung cấp cho riêng bạn "háo hức" thực hiện một điều tra viên mở kết nối và lấy hàng đầu tiên bên trong phương thức chính, thì điều tra viên sẽ không hoạt động từ 'TestFillRow' vì kết nối sẽ bị đóng mạnh. – GSerg

1

"SQLCLR không cho phép bất kỳ quyền truy cập dữ liệu nào bên trong TestFillRow" là một sai lầm.

Nếu bạn không sử dụng context connection = true chuỗi kết nối, bạn có thể truy cập dữ liệu bên trong phương thức FillRow.

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