6

Tôi có 2008 UDT này SQL Server:ADO.NET cổ điển - Làm thế nào để vượt qua UDT để lưu trữ thủ tục?

CREATE TYPE [dbo].[IdentityType] AS TABLE(
    [Id] [int] NOT NULL 
) 

Khá đơn giản. Về cơ bản cho phép tôi giữ một danh sách các id.

Tôi có thủ tục này được lưu trữ:

CREATE PROCEDURE [dbo].[Scoring_ScoreMultipleLocations] 
    @LocationIds [IdentityType] READONLY, 
    @DoRanking BIT = 0 
AS 
BEGIN 
    -- irrelevant code. 
END 

Entity Framework 4.0 không hỗ trợ thực hiện các thủ tục được lưu trữ mà mất người dùng định nghĩa các loại bảng như một tham số, do đó, tôi đang quay trở lại ADO.NET cổ điển. Tùy chọn duy nhất khác là chuyển một chuỗi được phân cách bằng dấu phẩy.

Dù sao, tôi đã tìm thấy this bài viết, nhưng hơi khó theo dõi.

Tôi không hiểu những gì dòng mã này được thực hiện:

DataTable dt = preparedatatable();

Họ thậm chí không cung cấp phương pháp đó, vì vậy tôi không biết mình phải làm gì ở đây.

Đây là phương pháp chữ ký của tôi:

internal static void ScoreLocations(List<int> locationIds, bool doRanking) 
{ 
    // how do i create DataTable?? 
} 

Vì vậy, tôi có một danh sách các int và cần phải bơm đó vào UDT.

Có ai có thể giúp tôi hiểu/chỉ cho tôi một bài viết rõ ràng về cách đạt được điều này không?

Trả lời

8

This article có thể trợ giúp thêm một chút.

Về cơ bản, bạn sẽ tạo một DataTable mới phù hợp với giản đồ, sau đó chuyển nó làm tham số.

Mã của preparedatatable() có lẽ sẽ giống như thế:

var dt = new DataTable(); 
dt.Columns.Add("Id", typeof(int)); 
return dt; 

Sau đó, bạn sẽ phải thêm locationIds của bạn:

foreach(var id in locationIds) 
{ 
    var row = dt.NewRow(); 
    row["Id"] = id; 
    dt.Rows.Add(row); 
} 

Sau đó gán dt như một tham số:

var param = cmd.Parameters.AddWithValue("@LocationIDs", dt); 
param.SqlDbType = SqlDbType.Structured; 
param.TypeName = "dbo.IdentityType"; 
+0

Ahh k, điều đó có ý nghĩa. Hãy thử ngay bây giờ, hãy theo dõi ... (+1 cho bây giờ). – RPM1984

+0

hoạt động, * nhưng * - vì một số lý do nó mất hơn 10 giây, sau đó cuối cùng sql profiler hiển thị "Lỗi - 2 - Bị hủy bỏ". Các sql sản xuất có vẻ tốt - khi tôi chạy nó trong ssms phải mất RPM1984

+0

Tôi có sử dụng nó mà không mất 10 giây; Không chắc chắn điều gì sẽ gây ra điều đó. Dù sao, nếu tham số chỉ cần phải là một danh sách các số nguyên, bạn có lẽ tốt hơn hết với một danh sách CSV và một chức năng chia anyway. TVP thực sự trợ giúp khi bạn cố gắng gửi nhiều giá trị được liên kết cho mỗi hàng (ví dụ: nhiều cột trong loại của bạn), trong đó có danh sách CSV, điều này sẽ yêu cầu dấu phân tách thứ cấp (ví dụ: danh sách CSV của dữ liệu phân tách đường ống). –

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