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

Có thể sử dụng `SqlDbType.Structured` để chuyển các Tham số Giá trị Bảng trong NHibernate không?

Ý tưởng đầu tiên của tôi, đặc biệt, là triển khai IType của riêng tôi .

public class Sql2008Structured : IType {
    private static readonly SqlType[] x = new[] { new SqlType(DbType.Object) };
    public SqlType[] SqlTypes(NHibernate.Engine.IMapping mapping) {
        return x;
    }

    public bool IsCollectionType {
        get { return true; }
    }

    public int GetColumnSpan(NHibernate.Engine.IMapping mapping) {
        return 1;
    }

    public void NullSafeSet(DbCommand st, object value, int index, NHibernate.Engine.ISessionImplementor session) {
        var s = st as SqlCommand;
        if (s != null) {
            s.Parameters[index].SqlDbType = SqlDbType.Structured;
            s.Parameters[index].TypeName = "IntTable";
            s.Parameters[index].Value = value;
        }
        else {
            throw new NotImplementedException();
        }
    }

    #region IType Members...
    #region ICacheAssembler Members...
}

Không có nhiều phương pháp được thực hiện; a throw new NotImplementedException(); mới là trong tất cả các phần còn lại. Tiếp theo, tôi đã tạo một tiện ích mở rộng đơn giản cho IQuery .

public static class StructuredExtensions {
    private static readonly Sql2008Structured structured = new Sql2008Structured();

    public static IQuery SetStructured(this IQuery query, string name, DataTable dt) {
        return query.SetParameter(name, dt, structured);
    }
}

Cách sử dụng điển hình đối với tôi là

DataTable dt = ...;
ISession s = ...;
var l = s.CreateSQLQuery("EXEC some_sp @id = :id, @par1 = :par1")
            .SetStructured("id", dt)
            .SetParameter("par1", ...)
            .SetResultTransformer(Transformers.AliasToBean<SomeEntity>())
            .List<SomeEntity>();

Được, nhưng "IntTable" là gì ? Đó là tên của kiểu SQL được tạo để chuyển đối số giá trị bảng.

CREATE TYPE IntTable AS TABLE
(
    ID INT
);

some_sp có thể giống như

CREATE PROCEDURE some_sp
    @id IntTable READONLY,
    @par1 ...
AS
BEGIN
...
END

Tất nhiên, nó chỉ hoạt động với Sql Server 2008 và trong cách triển khai cụ thể này với DataTable một cột duy nhất .

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

Đó chỉ là POC, không phải là một giải pháp hoàn chỉnh, nhưng nó hoạt động và có thể hữu ích khi được tùy chỉnh. Nếu ai đó biết giải pháp tốt hơn / ngắn hơn, hãy cho chúng tôi biết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm mối liên hệ giữa tài khoản thư cơ sở dữ liệu và nguyên tắc cơ sở dữ liệu trong SQL Server (T-SQL)

  2. Cách thiết lập Thư cơ sở dữ liệu trong SQL Server (SSMS)

  3. THIẾT LẬP TEXTSIZE không hoạt động trong SQL Server? Kiểm tra điều này.

  4. Mẹo nhanh để sửa chữa và khôi phục cơ sở dữ liệu SQL mà không cần sao lưu

  5. Cách sử dụng thủ tục lưu trữ ‘sp_server_info’ trong SQL Server