Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển loại giá trị bảng tới thủ tục được lưu trữ trên SQL Server thông qua Entity Framework

Giả sử bạn muốn gửi một bảng với một cột GUID.

Trước tiên, chúng ta cần tạo một cấu trúc bằng cách sử dụng SqlMetaData đại diện cho lược đồ của bảng (cột).

Đoạn mã dưới đây minh họa một cột có tên "Id" của GUID là loại bảng tham số thủ tục được lưu trữ trong SQL

var tableSchema = new List<SqlMetaData>(1)
{
  new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();

Tiếp theo, bạn tạo danh sách các bản ghi phù hợp với lược đồ bằng cách sử dụng SqlDataRecord .

Đoạn mã dưới đây trình bày cách thêm các mục bên trong danh sách bằng cách sử dụng lược đồ đã tạo ở trên. Tạo một SqlDataRecord mới cho từng mục trong danh sách. Thay thế SetGuid bằng loại tương ứng và thay thế Guid.NewGuid () làm giá trị tương ứng. Lặp lại SqlDataRecord mới cho từng mục và thêm chúng vào Danh sách

var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
  tableRow
};

Sau đó, tạo SqlParameter :

var parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds"; //@UserIds is the stored procedure parameter name
parameter.TypeName = "{Your stored procedure type name}"
parameter.Value = table;

var parameters = new SqlParameter[1]
{
  parameter
};

Sau đó, chỉ cần gọi thủ tục được lưu trữ bằng cách sử dụng Cơ sở dữ liệu .SqlQuery .

IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
  result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
    .ToList();         // calls the stored procedure
    // ToListAsync();  // Async
{

Trong SQL Server, hãy tạo Loại bảng do người dùng xác định của bạn (tôi đặt chúng bằng TTV, Giá trị được nhập theo bảng):

CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
  [Id] [uniqueidentifier] NOT NULL
)
GO

Sau đó, chỉ định kiểu làm tham số (đừng quên, Giá trị Loại Bảng phải được chỉ đọc!):

CREATE PROCEDURE [dbo].[GetUsers] (
  @UserIds [UniqueidentifiersTTV] READONLY
) AS
BEGIN
  SET NOCOUNT ON

  SELECT u.* -- Just an example :P
  FROM [dbo].[Users] u
  INNER JOIN @UserIds ids On u.Id = ids.Id
END


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để phát hiện một chuỗi có chứa các ký tự đặc biệt?

  2. Thay đổi sql-server DB từ dạng bảng thành đa chiều

  3. Không thể tải hàng loạt. Mã lỗi hệ điều hành 5 (Quyền truy cập bị từ chối.)

  4. Sự khác biệt giữa CHAR và VARCHAR trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / T-SQL Phần 31

  5. Quy trình lưu trữ Sql với rất nhiều tham số