2012-04-16 13 views
9

के पीछे SqlDataSource कोड मेरे पास एक ही पृष्ठ पर एक SQLDataSource, एक ग्रिडव्यू और ड्रॉपडाउनलिस्ट है। DropDownList चयन SelectCommands, UpdateCommands, और DeleteCommands के सेट से जुड़ा हुआ है ताकि मैं ग्रिडव्यू ऑटोजनेरएडिट बटन = "सत्य" और AutoGenerateUpdateButton = "true" तंत्र का लाभ उठा सकूं।इवेंट ऑर्डर

Page_Load 
{ 
    switch(ddl.SelectedItem.Text) 
    { 
    case "A": 
     sqlDS.SelectCommand = "Select * From A"; 
     sqlDS.UpdateCommand = "Update A Set Name = @Name WHERE ID = @ID"; 
     sqlDS.DeleteCommand = "Delete A WHERE ID = @ID"; 
     break; 
    ... 
    } 

    sqlDS.DataBind(); 
    grd.DataSourceID = sqlDS.ID; 
    grd.DataBind(); 
} 

पैरामीटर जोड़ने के लिए मुझे किस बिंदु पर या किस बिंदु पर आवश्यकता है? क्या यह स्वचालित है? मैं मूल रूप से बस एक तालिका से कॉलम को अद्यतन और हटाने की क्षमता चाहता हूं। मैं यह सब वास्तविक .cs फ़ाइल में करना चाहता हूं, जैसा कि .aspx फ़ाइल के विपरीत है क्योंकि मैं इसे और अधिक गतिशील बनाना चाहता हूं; लेकिन अभी के लिए मैं बस मूल बातें प्राप्त करना चाहता हूँ। मुझे संदेह है कि मेरे पास अनुचित घटना में DataBind() तर्क हो सकता है क्योंकि मैं डेटा बाइंडिंग से जुड़े ईवेंट के क्रम को पूरी तरह से समझ नहीं पा रहा हूं।

प्रश्न जटिल नहीं हैं और इसमें शामिल होने या विचार शामिल नहीं हैं; वे एकल टेबल पर सरल चयन कर रहे हैं।

+0

एक अंतर्निहित टेम्पलेट है जिसे डायनामिक डेटा कहा जाता है जो एएसपी के साथ आता है।नेट-ऑफ-द-बॉक्स जो सामान्य रूप से डेटा स्रोत में किसी भी तालिका से रिकॉर्ड्स को देखने, अपडेट करने, संपादित करने और हटाने की क्षमता प्रदान करता है। आप अलग-अलग पृष्ठों, व्यक्तिगत कार्यों, फ़ील्ड प्रकार इत्यादि को भी अनुकूलित कर सकते हैं। यहां अधिक जानकारी देखें: http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb

+0

क्या आपने विचार किया है 'LinqDataSource' और LINQ-To-SQL/आदि का उपयोग कर। अपने डेटाबेस के साथ काम करने के लिए? यह बहुत आसान हो सकता है क्योंकि यह स्वचालित रूप से चयन/आवेषण/अपडेट के लिए नलसाजी को संभालता है। – mellamokb

+0

भले ही आप डायनामिक डेटा का उपयोग न करें, फिर भी कुछ स्रोत कोड की समीक्षा करना एक बुरा विचार नहीं हो सकता है कि यह कैसे विचार करता है कि आपके कोड को सरल कैसे बनाएं और SQL कथन उत्पन्न करने के लिए अंतर्निहित टूल का लाभ उठाएं , इत्यादि। इस तरह की चीज कई बार पहले की गई है, और इस पर निर्भर करते हुए कि आप इसके बारे में कैसे जाते हैं, इसके बारे में बहुत आसान और कठिन तरीके हैं। – mellamokb

उत्तर

10

संपादित: यह प्रकट होता है कि यदि आप GridView पर AutoGenerateColumns = "true" का उपयोग करें और SQLDataSource के माध्यम से पॉप्युलेट, यह स्वतः ही नियंत्रण के मूल्यों नाम से SQL क्वेरी में उचित मानकों के लिए कोई अतिरिक्त बिना बाँध होगा कोड। । फिर भी, हम, GetInsertCommand(true), आदि का उपयोग करने के लिए इतना है कि आदेशों स्तंभ नाम का उपयोग करें (जहाँ मैं SqlCommandBuilder उपयोग करने के लिए कैसे कुछ gotchas रहे हैं दिखाने के लिए नीचे दिए गए कोड को देखने के लिए है लेकिन जैसा कि मैंने परीक्षण में पता चला है:

  • आप अपने GridView की DataKeyNames निर्धारित करने की आवश्यकता
  • आप अपने sqlDS पर OldValuesParameterFormatString="Original_{0}" स्थापित करने के लिए
  • आप पर scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges; की आवश्यकता होगी की आवश्यकता होगी। अपने SqlCommandBuilder तुम सिर्फ पुराने मूल्यों की तुलना के बिना अद्यतन करने के लिए चाहते हैं।
  • यह ऐसा लगता है कि यदि आप चुन रहे हैं/अद्यतन/हटाएं प्रोग्रामिंग के रूप में एक SQLDataSource पर eCommand, आपको इसे प्रत्येक पोस्टबैक पर करना होगा।

हालांकि, मामले में आप अनुकूलित करने के लिए की जरूरत है, SqlDataSource नियंत्रण घटनाओं Inserting, Updating, प्रदान करता है Deleting कि आप एसक्यूएल कार्यों डेटाबेस पर लिया जाता है से पहले पैरामीटर भरे जा करने के लिए उपयोग कर सकते हैं:

sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating); 

protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@Name"].Value = // retrieve value from user entry 
} 

एक्सेस के माध्यम से Inserting और Deleting ईवेंट में एक ही तरह की चीज की जा सकती है।


नोट ताकि आप अपनी टेबल के सभी युक्त एक विशाल स्विच बयान का निर्माण करने की जरूरत नहीं है कि आप भी उचित हटाएँ/सम्मिलित करें/अद्यतन आदेश उत्पन्न स्वचालित रूप से SqlCommandBuilder वर्ग का उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

string tableName = ddl.SelectedValue; 
string connectionString = ConfigurationManager 
    .ConnectionStrings["MyConnectionString"].ConnectionString; 
string select = "SELECT * FROM [" + tableName + "]"; 
SqlDataAdapter sda = new SqlDataAdapter(select, connection); 
SqlCommandBuilder scb = new SqlCommandBuilder(sda); 

sqlDS.SelectCommand = select; 
sqlDS.InsertCommand = scb.GetInsertCommand(true).CommandText; 
sqlDS.UpdateCommand = scb.GetUpdateCommand(true).CommandText; 
sqlDS.DeleteCommand = scb.GetDeleteCommand(true).CommandText; 

निश्चित रूप से यह इच्छा के अनुसार, आपके टेबल के सभी प्राथमिक कुंजी है कि बयान प्रासंगिक अद्यतन पैदा करते हैं और नष्ट करने के लिए इस्तेमाल किया जा सकता है। यदि नहीं, तो आपको गतिशील एसक्यूएल पीढ़ी के बारे में अपवाद मिलेगा। यहां तक ​​कि यदि आपको डेटाबेस इंजन पर स्कीमा को देखने की रन-टाइम लागत की वजह से इस विधि को पसंद नहीं है, तो आप उन्हें सभी को हाथ में टाइप करने के बजाय हमेशा टी 4 टेम्पलेट के साथ प्री-जेनरेट कर सकते हैं।

+1

बहुत बहुत धन्यवाद! SqlCommandBuilder से .GetInsertCommand (true) भाग वह था जो मैं याद कर रहा था। मैं गतिशील रूप से एक आदेश के बजाय एक स्ट्रिंग उत्पन्न कर रहा था! मैं अंततः LinqDataSource का उपयोग करने की भी योजना बना रहा हूं, लेकिन अभी मेरे कोड का केवल एक हिस्सा लिंक का उपयोग करता है; हालांकि मैं इसे अद्यतन करने की प्रक्रिया में हूं। एक बार फिर धन्यवाद! – Mark

संबंधित मुद्दे