Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apakah mungkin menggunakan `SqlDbType.Structured` untuk meneruskan Parameter Bernilai Tabel di NHibernate?

Ide pertama saya, ad hoc, adalah mengimplementasikan IType saya sendiri .

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...
}

Tidak ada lagi metode yang diterapkan; a throw new NotImplementedException(); . baru ada di semua sisanya. Selanjutnya, saya membuat ekstensi sederhana untuk 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);
    }
}

Penggunaan umum bagi saya adalah

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>();

Oke, tapi apa itu "IntTable" ? Ini adalah nama tipe SQL yang dibuat untuk meneruskan argumen nilai tabel.

CREATE TYPE IntTable AS TABLE
(
    ID INT
);

Dan some_sp bisa seperti

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

Ini hanya berfungsi dengan Sql Server 2008 tentu saja dan dalam implementasi khusus ini dengan DataTable kolom tunggal .

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

Ini hanya POC, bukan solusi lengkap, tetapi berfungsi dan mungkin berguna saat disesuaikan. Jika seseorang mengetahui solusi yang lebih baik/pendek, beri tahu kami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan pernyataan IF/ELSE untuk memperbarui atau membuat entri node xml baru di Sql

  2. Membuat Kasus untuk Layanan SQL Server Reguler

  3. Kembalikan Semua Kolom yang Tidak Dihitung dari Tabel di SQL Server

  4. Sesuaikan Alarm Awan Spotlight

  5. SET versus SELECT saat menetapkan variabel?