SORU
16 Kasım 2011, ÇARŞAMBA


Varlık Çerçevesi Saklı Yordam Tablo Değerli Parametre

Tablo bir değer kabul eden bir saklı yordam parametre çağırmak için çalışıyorum. Bu doğrudan benim ExecuteStoreQuery komutu ObjectContext kapalı kullanarak yapabilirsiniz kadarıyla Varlık Çerçevesi içinde henüz ama desteklenmeyen biliyorum. Aşağıdaki ExecuteStoredProcecdure yöntemi var burada genel varlık çerçevesi bir depo var:

public IEnumerable<T> ExecuteStoredProcedure<T>(string procedureName, params object[] parameters)
{
    StringBuilder command = new StringBuilder();
    command.Append("EXEC ");
    command.Append(procedureName);
    command.Append(" ");

    // Add a placeholder for each parameter passed in
    for (int i = 0; i < parameters.Length; i  )
    {
        if (i > 0)
            command.Append(",");

        command.Append("{"   i   "}");
    }

    return this.context.ExecuteStoreQuery<T>(command.ToString(), parameters);
}

Komut dizesi böyle biter:

EXEC someStoredProcedureName {0},{1},{2},{3},{4},{5},{6},{7}

Bir tablo değerli bir parametre ve bu tatili kabul eden bir saklı yordamı çalıştırmak için bu yöntemi denedim. Parametreleri yazın SqlParameter ve tablo değerli bir parametre için gerekli Yapısal SqlDbType sahip olması gereken here okudum. Bunu ben yaptım ve belirten bir hata alıyorum:

The table type parameter p6 must have a valid type name

Yani, SqlParameter kurdum.Kullanıcı adı TypeName veritabanı oluşturdum ve o zaman gerçekten yararlı aşağıdaki hatayı alıyorum sorguyu çalıştırdığımda: türü tanımlanmış

Incorrect syntax near '0'.

Sorgu geri ADO.NET ve veri okuyucu çalıştırmak için döner ama bu iş için veri bağlamı kullanarak almayı umuyordum eğer çalıştırmak için alabilirim.

Bir şekilde bir tablo geçirmeye değer parametre ExecuteStoreQuery kullanan var mı? Ayrıca, aslında İlk Varlık Çerçevesi Kod kullanarak ve ExecuteStoreQuery yöntemi kullanılabilir almak için bir ObjectContext için DbContext örüyorum. Bu gerekli veya DbConext karşı bu kadar iyi yapabilirim ki?

CEVAP
23 Mart 2012, Cuma


GÜNCELLEME

Nuget bu desteği https://github.com/Fodsuk/EntityFrameworkExtras#nuget () EF4,EF5,EF6 Paketi ekledim

kod örnekleri için GitHub depo çıkış.

Soru biraz kapalı, ama hiçbiri insanlar store proc Kullanıcı Tanımlı Tablolar geçirmeye çalıştıkları için daha az yararlı. Etrafında Nick örnek ve diğer Stackoverflow mesaj ile oynadıktan sonra, ben bu ile geldi:

  class Program
{
    static void Main(string[] args)
    {
        var entities = new NewBusinessEntities();

        var dt = new DataTable();
        dt.Columns.Add("WarningCode");
        dt.Columns.Add("StatusID");
        dt.Columns.Add("DecisionID");
        dt.Columns.Add("Criticality");

        dt.Rows.Add("EO01", 9, 4, 0);
        dt.Rows.Add("EO00", 9, 4, 0);
        dt.Rows.Add("EO02", 9, 4, 0);

        var caseId = new SqlParameter("caseid", SqlDbType.Int);
        caseId.Value = 1;

        var userId = new SqlParameter("userid", SqlDbType.UniqueIdentifier);
        userId.Value = Guid.Parse("846454D9-DE72-4EF4-ABE2-16EC3710EA0F");

        var warnings = new SqlParameter("warnings", SqlDbType.Structured);
        warnings.Value= dt;
        warnings.TypeName = "dbo.udt_Warnings";

        entities.ExecuteStoreProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);

    }
}

public static class ObjectContextExt
{
    public static void ExecuteStoreProcedure(this ObjectContext context, string storeProcName, params object[] parameters)
    {
        string command = "EXEC "   storeProcName   " @caseid, @userid, @warnings";

        context.ExecuteStoreCommand(command, parameters);
    }

}

ve Mağaza proc aşağıdaki gibi görünüyor...

ALTER PROCEDURE [dbo].[usp_RaiseWarnings_rs]
(
     @CaseID int 
    ,@UserID uniqueidentifier = '846454D9-DE72-4EF4-ABE2-16EC3710EA0F' --Admin
    ,@Warnings dbo.udt_Warnings READONLY
)
AS

ve Kullanıcı Tanımlı Tablo aşağıdaki gibi görünüyor...

CREATE TYPE [dbo].[udt_Warnings] AS TABLE(
[WarningCode] [nvarchar](5) NULL,
[StatusID] [int] NULL,
[DecisionID] [int] NULL,
[Criticality] [int] NULL DEFAULT ((0))

)

Buldum kısıtlamaları vardır:

  1. ExecuteStoreCommand içine geçmesi parametreleri sırayla olmak zorunda mağaza işlem parametreleri ile
  2. Eğer varsayılan var onlar bile Kullanıcı her sütun Tanımlanan Tablo geçmek zorunda. Benim UDT(1,1) NOT NULL KİMLİK sütunu edemezdim öyle görünüyor

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008