2013-02-05 46 views
5

मुझे पता है कि इस प्रकार के प्रश्न को SO पर कम से कम एक दर्जन बार पूछा गया है, लेकिन मैं पिछले सभी प्रश्नों और उत्तरों से गुज़र चुका हूं जो मुझे यहां मिल सकता है और कोई भी नहीं मुझे आवेदन मिला है। मैं अपने पेज पर कई फॉर्म व्यू ऑब्जेक्ट्स का उपयोग कर रहा हूं और अब उनमें से एक को संपादित करने के लिए विकल्प जोड़ना चाहता हूं। FormView एक संग्रहीत प्रक्रिया से जुड़ा हुआ SQLDataSource की आबादी है, तो मैं रिकॉर्ड को अपडेट करने के लिए एक संग्रहीत प्रक्रिया बना दिया है और SQLDataSource, जो अब इस तरह दिखता है के लिए यह कहा:प्रक्रिया या फ़ंक्शन 'xyz' में बहुत से तर्क हैं

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

जब मैं एक रिकॉर्ड अद्यतन करने का प्रयास, मुझे एक त्रुटि मिल रही है जो कहती है कि मेरी क्वेरी में बहुत सारे पैरामीटर हैं। मैंने तीन बार जांच की है कि मेरे कोड में पैरामीटर मेरी संग्रहीत प्रक्रिया में बिल्कुल (नाम, संख्या, और यहां तक ​​कि ऑर्डर) से मेल खाते हैं।

उत्तर खोजने का प्रयास करने में, मैं this post पर आया जो संदर्भित this site (archive.org पर जाना था क्योंकि मूल नीचे प्रतीत होता है)। मैंने पैरामीटर को trace फ़ंक्शन में जोड़ने के लिए सुझाए गए सुझावों को लागू किया। जो मैंने पाया वह था कि मेरी संग्रहीत प्रक्रिया में, चुनिंदा प्रक्रिया में कुछ "लुकअप" मान हैं जो अद्यतन प्रक्रिया में नहीं हैं। जिस तालिका में मैं अद्यतन करने की कोशिश कर रहा हूं केवल टेस्टर की आईडी है, लेकिन उपयोगकर्ता अपना नाम भी देखना चाहते हैं, इसलिए यह उस तालिका का संदर्भ देता है, लेकिन फॉर्म व्यू में उन फ़ील्ड केवल संपादन मोड के दौरान पढ़े जाते हैं ताकि वे कर सकें इसे बदलने की कोशिश नहीं है। अन्य सभी पैरामीटर लाइन अप ... केवल वे लुकअप मान बंद हैं।

मैंने सोचा कि पैरामीटर की विशिष्ट सूची को शामिल करने के लिए यह केवल उन पैरामीटर का उपयोग करेगा, लेकिन यह गलत प्रतीत होता है। अब मैं स्टंप हो गया हूं क्योंकि मैंने पहले से ही पैरामीटर निर्दिष्ट किए हैं, और मैं कहीं भी नहीं देख सकता कि उन्हें चयनित संग्रहित प्रक्रिया से लोगों के साथ ओवरराइट किया जा रहा है। मैं कहां कहूं कि उन पठनीय मूल्यों का उपयोग न करें?

मैं उन्हें मूल संग्रहीत प्रक्रिया से हटाना नहीं चाहता क्योंकि उन्हें उपयोगकर्ताओं द्वारा आवश्यकता होगी। एक कामकाज जो मैंने अभी तक किया है, उन्हें संग्रहीत प्रक्रिया में जोड़ना है और फिर कभी उनका उपयोग नहीं करना है। हालांकि मैं काफी हद तक निश्चित हूं कि यह काम करेगा, यह इसे ठीक करने के बजाय समस्या को कवर करना बहुत अधिक है।


संपादित करें: अतिरिक्त कोड, प्रति अनुरोध

इस विधि कि trace कार्य करने के लिए पैरामीटर आउटपुट है:

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

इस के लिए इस्तेमाल किया संग्रहीत प्रक्रिया है अद्यतन:

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

क्या आपने जांच की है कि क्या कोई वर्तनी त्रुटियां या डेटा प्रकार रूपांतरण त्रुटि है? –

+0

@ रुचीराहुल दोशी हां। मैंने Excel में पैरामीटर के दोनों सेटों की प्रतिलिपि बनाई और लाइन तुलना करके लाइन चला गया। यहां इस सब-आम प्रश्न में यह सबसे आम समस्या थी, इसलिए मैं यह सुनिश्चित करने के लिए बहुत सावधान था कि वे सटीक थे। सभी मार्गों को पारित करने के लिए 'ट्रेस' का उपयोग करने के बाद, मैं यह सुनिश्चित कर सकता हूं कि यह वास्तव में बहुत से तर्क पारित कर रहा है, लेकिन मुझे नहीं पता कि इसे कैसे बंद किया जाए। – techturtle

+0

यदि आप दिमाग में नहीं हैं तो कृपया अपना "usp_UpdateTest" और "TestSqlDataSource_Updating" पेस्ट करें। –

उत्तर

6

इसे अपने आप पर लगाना समाप्त हो गया। यह इस तथ्य से संबंधित था कि विजुअल स्टूडियो ने संग्रहीत प्रक्रिया की स्कीमा के आधार पर मेरे लिए टेम्पलेट बनाए। जब टेम्पलेट्स ऑटोजनरेटेड कर रहे हैं, <EditItemTemplate> खंड में हर पाठ बॉक्स इस तरह उत्पन्न हो जाता है:

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

बाहर कर देता है कि यह Bind बयान है कि इस वजह से है। वीएस स्वचालित रूप से Bind का उपयोग करके आबादी वाले किसी भी क्षेत्र के लिए पैरामीटर बनाता है। हालांकि मुझे विश्वास था कि <UpdateParameters> सेक्शन को इसे ओवरराइड करना चाहिए था, यह वास्तव में दूसरी तरफ था।मैं Bind से Eval करने के लिए उन क्षेत्रों पर कोड को बदलने के द्वारा अपने मापदंडों वापस पारित करने से ये कुछ केवल पढ़ने के लिए फ़ील्ड को रोकने में सक्षम था:

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

निर्माण पूरी तरह से अब।


परिशिष्ट:

मिला है कि इस दूसरी दिशा में एक ही समस्या के रूप में अच्छी तरह से कारण बनता है। यदि आप किसी फ़ील्ड को चिह्नित करते हैं तो आप Eval के रूप में संपादित नहीं करना चाहते हैं, लेकिन इसे अपडेट में शामिल करने की आवश्यकता है (जैसे पंक्ति आईडी) यह काम नहीं करेगा, इस बार बहुत कम पैरामीटर के लिए। मैं अब सोच रहा हूं कि <UpdateParameters> सेक्शन का उद्देश्य भी है, क्योंकि यह वहां कुछ भी नहीं है ...

+0

मैंने आपके समाधान की कोशिश की, बाइंड को इवल के साथ बदल दिया। यह मुझे 'प्रक्रिया या कार्य' त्रुटि नहीं देता है xyz 'में बहुत से तर्क निर्दिष्ट हैं' अब डेटा अपडेट नहीं किया गया है –

+0

@ थंडोटी आप 'सभी * 'बाइंड' स्टेटमेंट को 'इवल' के साथ प्रतिस्थापित नहीं करना चाहते हैं, केवल कुछ जो डेटा को अपडेट नहीं करना चाहते हैं। 'Eval' केवल पढ़ने योग्य कमांड है, इसलिए यह उन फ़ील्ड को अपडेट नहीं करेगा। – techturtle

+0

आपके द्वारा आने वाले समाधान को पोस्ट करने के लिए धन्यवाद। मैं एक एएसपी प्रोग्रामर नहीं हूं लेकिन यह मुझे दूसरों की मदद करने की अनुमति देगा जब SQL सर्वर खांसी एक त्रुटि को सफल बनाता है। –

1

आप ऑनडिलेटिंग ईवेंट (ई। कॉमांड.प्रैमिटर.रमोवेट) के दौरान अवांछित पैरामीटर हटा सकते हैं। (मैं))।