2013-02-05 14 views
5

Bu tür bir soruyu SO üzerinde en az bir düzine kez sordum, ancak burada bulabildiğim tüm önceki soruları ve yanıtları inceledim ve Başvuruyu buldum. Sayfamda birkaç FormView nesnesi kullanıyorum ve şimdi bunlardan birini düzenlemek için seçenek eklemek istiyorum. FormView bir saklı yordam bağlı SqlDataSource tarafından doldurulan, bu yüzden kayıtlarını güncellemek için saklı bir yordam yaptı ve şimdi şuna benzer SqlDataSource, bunu eklenir:'xyz' yordamının ya da işlevinin çok fazla argümanı var belirtildi

<asp:SqlDataSource ID="TestSqlDataSource" runat="server" 
        SelectCommandType="StoredProcedure" 
        ConnectionString="<%$ ConnectionStrings:development %>" 
        SelectCommand="usp_GetNewTestDetails" 
        UpdateCommand="usp_UpdateTest" 
        UpdateCommandType="StoredProcedure" 
        onupdating="TestSqlDataSource_Updating"> 
    <SelectParameters> 
     <asp:SessionParameter SessionField="TestID" Name="TestID"/> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="testId" Type="Int32"/> 
     <asp:Parameter Name="testerLicense" Type="Int32" /> 
     <asp:Parameter Name="premiseOwner" Type="String" /> 
     <asp:Parameter Name="premiseAddress" Type="String" /> 
     <asp:Parameter Name="premiseCity" Type="String" /> 
     <asp:Parameter Name="premiseState" Type="String" /> 
     <asp:Parameter Name="premiseZip" Type="String" /> 
     <asp:Parameter Name="protectionType" Type="String" /> 
     <asp:Parameter Name="testType" Type="String" /> 
     <asp:Parameter Name="repairs" Type="String" /> 
     <asp:Parameter Name="notes" Type="String" /> 
     <asp:Parameter Name="testDate" Type="DateTime" /> 
     <asp:Parameter Name="employerName" Type="String" /> 
     <asp:Parameter Name="employerAddress" Type="String" /> 
     <asp:Parameter Name="phoneNumber" Type="String" /> 
     <asp:Parameter Name="emailAddress" Type="String" /> 
     <asp:Parameter Name="dataEntryName" Type="String" /> 
     <asp:Parameter Name="dataEntryPhone" Type="String" /> 
     <asp:Parameter Name="signature" Type="String" /> 
     <asp:Parameter Name="entryDate" Type="DateTime" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

ben bir kaydı güncellemek girişiminde, Sorgumda çok fazla parametre olduğunu belirten bir hata alıyorum. Kodumdaki parametrelerin benim saklı yordamımdakilerle tam olarak eşleştiğini (ad, numara ve hatta sipariş) üç kez kontrol ettim. Yanıtları bulmaya çalışırken, this site numaralı başvuruya atıfta bulunan this post numaralı telefona rastladım (orjinali göründüğü için archive.org adresine gitmek zorunda kaldı). Parametreleri eklemek için önerdikleri şeyi trace işlevine uyguladık. Bulduğum şey, benim saklı yordamımda, güncelleme yordamında olmayan seçme işleminden birkaç "arama" değeri bulunduğudur. Güncellemeye çalıştığım masa sadece test cihazının kimliğini taşıyor, ancak kullanıcılar isimlerini de görmek istiyorlar, bu yüzden tabloya başvuruyor, ancak FormView'da bu alanlar düzenleme modunda salt okunurlar. Onu değiştirmeye teşebbüs etme. Diğer tüm parametreler sıralanıyor ... sadece bu arama değerleri kapalı.

Bu parametreleri yalnızca bu parametreleri kullanacağını iletmek için belirli parametre listesini ekleyerek yanlış olduğunu düşündüm. Şimdi güvendim çünkü parametreleri zaten belirttim ve seçili saklı yordamlardan biriyle yazıldığını göremiyorum. Bu salt okunur değerleri kullanmamalarını nerede söyleyebilirim?

Kullanıcıların ihtiyaç duyacağı için bunları orijinal saklı yordamından kaldırmak istemiyorum. Şimdiye kadar geldiğim bir geçici çözüm, onları saklı yordama eklemektir ve sonra bunları asla kullanmaz. Her ne kadar bu işe yarayacak olsa da, sorunu düzeltmekten ziyade sorunu örtbas ediyor.


DÜZENLEME: ek kod Bu trace işlev parametreleri çıktılar yöntemdir isteğe

başına:

protected void TestSqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    for (int i = 0; i < e.Command.Parameters.Count; i++) 
    { 
     Trace.Write(e.Command.Parameters[i].ParameterName); 
     if (e.Command.Parameters[i].Value != null) 
     { 
      Trace.Write(e.Command.Parameters[i].Value.ToString()); 
     } 
    } 
} 

Bu kullanılan saklı işlemdir güncelleme:

ALTER PROCEDURE [dbo].[usp_UpdateTest] 
    @testId INT , 
    @testerLicense INT , 
    @premiseOwner VARCHAR(50) , 
    @premiseAddress VARCHAR(150) , 
    @premiseCity VARCHAR(50) , 
    @premiseState VARCHAR(2) , 
    @premiseZip VARCHAR(10) , 
    @protectionType VARCHAR(11) , 
    @testType VARCHAR(2) , 
    @repairs VARCHAR(200) , 
    @notes VARCHAR(300) , 
    @testDate DATETIME , 
    @employerName VARCHAR(50) , 
    @employerAddress VARCHAR(150) , 
    @phoneNumber VARCHAR(25) , 
    @emailAddress VARCHAR(60) , 
    @dataEntryName VARCHAR(50) , 
    @dataEntryPhone VARCHAR(25) , 
    @signature VARCHAR(50) , 
    @entryDate DATETIME 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     UPDATE dbo.Tests 
     SET  TesterLicense = @testerLicense , 
       PremiseOwner = @premiseOwner , 
       PremiseAddress = @premiseAddress , 
       PremiseCity = @premiseCity , 
       PremiseState = @premiseState , 
       PremiseZip = @premiseZip , 
       ProtectionType = @protectionType , 
       TestType = @testType , 
       Repairs = @repairs , 
       Notes = @notes , 
       TestDate = @testDate , 
       EmployerName = @employerName , 
       EmployerAddress = @employerAddress , 
       PhoneNumber = @phoneNumber , 
       EmailAddress = @emailAddress , 
       DataEntryName = @dataEntryName , 
       DataEntryPhone = @dataEntryPhone , 
       Signature = @signature , 
       EntryDate = @entryDate 
     WHERE TestID = @testId 
    END 
+0

Herhangi bir yazım hatası veya veri türü dönüştürme hatası olup olmadığını kontrol ettiniz mi? –

+0

@RuchiRahulDoshi Evet. Her iki parametre kümesini de Excel'e kopyaladım ve karşılaştırarak satır satırına gittim. Bu çok yaygın olan soruda en yaygın sorun buydu, bu yüzden kesin olduklarından emin olmak için çok dikkatliydim. Geçirdiği tüm parametreleri görüntülemek için 'trace 'kullanmış olduğundan, aslında çok fazla argüman geçtiğinden emin olabilirim, ama nasıl kapatacağımı bilmiyorum. – techturtle

+0

"Usp_UpdateTest" ve "TestSqlDataSource_Updating" öğelerinizi, eğer sakıncası yoksa buraya yapıştırır mısınız? –

cevap

6

Bunu kendi başıma hallederek sona erdi. Visual Studio'nun saklı yordamın şemasına göre benim için şablonlar yaratmasıyla ilgiliydi. şablonları otomatik olarak oluşturulan zaman, <EditItemTemplate> bölümdeki her metin kutusu böyle oluşturulan alır:

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Bind("TestID") %>'/> 

bu neden Bind deyimi olduğunu çıkıyor. VS otomatik olarak Bind kullanarak doldurulan herhangi bir alan için bir parametre oluşturur. Her ne kadar <UpdateParameters> bölümünün bunu geçersiz kıldığına inanmaya yönlendirilmiş olsam da, aslında bunun tersi oldu.Ben Bind den Eval için bu alanlarda kodunu değiştirerek kendi parametrelerini geri geçişini bu birkaç salt okunur alanları önlemeyi başarmıştır:

<asp:TextBox ID="TestIDTextBox" runat="server" Text='<%# Eval("TestID") %>'/> 

İşleri mükemmel şimdi.


Ek: bu da başka bir yönde aynı soruna neden olduğu

bulunamamıştır. Düzenlemeyi istemediğiniz bir alanı Eval olarak işaretlerseniz ancak güncellemeye (satır kimliği gibi) dahil edilmesi gerekiyorsa, bu sefer çok az parametre için çalışmayacaktır.

+0

Çözümünüzü Bind'i Eval ile değiştirerek denedim. Bana hata 'vermez' yordamı veya işlevi 'xyz' artık belirtilen çok fazla argümanı var ama artık veri güncellenmiyor –

+0

@ThandoTee * Tüm * the Bind' deyimlerini 'Eval' ile değiştirmek istemezsiniz, Verileri güncellememesi gereken sadece birkaçı. "Eval" salt okunur bir komuttur, bu yüzden bu alanları güncellemez. – techturtle

+0

Bulduğunuz çözümü gönderdiğiniz için teşekkür ederiz. Ben bir ASP programcısı değilim, ancak SQL Server öksürdüğünde bir hataya neden olduğunda başkalarına yardım etmeme izin verecek. –

1

İstenmeyen parametreleri silebilirsiniz, örneğin OnDeleting olayı (e.Command.Parameters.RemoveAt) (ben)).

İlgili konular