53

Tek bir int türünde sütunu olan bir tablo olan tablo değerli bir parametre alan saklı yordam oluşturdum. Buradaki fikir, bir kimlik listesinin listesini mağaza prosedürüne aktarmak ve sp'nin verilerle çalışmasına izin vermektir. Ancak, iletilecek veri bulunmadığı durumlarda, sorunlarla karşılaşıyorum (verilerim olduğunda işler doğru çalışıyor). Bir listeyi IEnumerable'a dönüştürüyorum ve sp için tablo değerli parametresine bağladım.Boş liste veya boş değerde saklı yordamdaki tablo değerli parametreye bağlanma (.net)

System.ArgumentException hatasına neden olan boş bir listeyi bağlamayı denedim. SqlDataRecord numaralandırmada kayıt yok. Hiçbir satır içermeyen tablo değerli bir parametre göndermek için, bunun yerine değer için boş bir başvuru kullanın.

Sonra (yukarıdaki mesajı nereyevaracağını olduğunu düşündüm) boş değer bağlamak çalıştı, ama bu sadece farklı bir hata mesajını ortaya

System.NotSupportedException: 'parametresi için DBNull değeri @MainItemIdList ' desteklenmiyor. Tablo değerli parametreler DBNull olamaz.

Tablo bildirme parametresini sp bildirimde null olarak bildirebileceğiniz gibi görünmüyor. Boş bir listeyi tablo değerli parametresine bağlamak için doğru yöntem nedir?

cevap

78

Bu hile şudur: parametresinde hiç geçiş yapmayın. Tablo değerli bir parametre için varsayılan değer boş bir tablodur.

Özel durum iletisinin bu kadar yararsız olması çok ayıptır.

+8

Yeni bir cevap eklemek veya geliştirmek için asla acıtmaz. Bilgi hala geçerlidir ve başka biri yararlı bulacaktır (işte bu sitenin tüm noktası!). +1 –

+0

Düz eski masa adaptörleri kullanılıyorsa bunun nasıl yapılacağı hakkında bir fikriniz var mı? TableAdapter, SP ile aynı imzaya sahip bir CLR proxy işlevini kullanır ve boş olmayan bir değer bekler. Null veya DbNull.Value geçerken hata atıyor. –

+0

Yukarı 1. Tam olarak ne yapmam gerekti - test edildi ve harika çalışıyor. –

2

'Parametreyi geçmemesi' ifadesinin ne anlama geldiği konusunda biraz kafam karışmıştı.

new SqlParameter("yourParameterName", SqlDbType.Structured) 
    { 
     Direction = ParameterDirection.Input, 
     TypeName = "yourUdtType", 
     Value = null 
    }; 

Bu 'default' olarak parametreyi geçecek: Ne Varlık Framework ExecuteSqlCommandAsync() için çalışan biter budur.

0

Boş bir IEnumerable<int>'u iletirken hata alıyorum, ancak boş bir List<int> ilettiğimde iyi çalışıyor.

İlgili konular