2011-11-10 8 views
6

मेरे पास एक डेटासेट है जो एक सीएसवी फ़ाइल से गतिशील रूप से बनाया गया है। मैं जो करना चाहता हूं वह मेरी एमएस एक्सेस टेबल में पंक्तियां डालना है, लेकिन मैं यह नहीं समझ सकता कि इसके साथ कहां से शुरुआत करें।सी # डेटासेट डीबी

डेटासेट में डेटा के शीर्षलेख ऑर्डर तक भिन्न हो सकते हैं लेकिन हेडर का नाम हमेशा एक्सेस डेटाबेस से मेल खाता है। क्या मुझे डालने के आदेश में हेडर नाम को स्थिर रूप से कॉल करना है या क्या मैं डेटासेट से हेडर बना सकता हूं?

मुझे पता है कि कनेक्शन कैसे बनाया जाए और इसे डेटाबेस में खोलें, लेकिन मुझे यकीन नहीं है कि तालिका शीर्षलेखों को गतिशील रूप से खींचने के लिए सम्मिलित आदेश में कैसे बनाया जाए।

सी # प्रोग्रामिंग की बात आती है तो मैं बहुत हरा हूं इसलिए यदि आप इसे मेरे लिए वर्तनी कर सकते हैं तो मैं वास्तव में इसकी सराहना करता हूं!

आईडी, मद, लागत, खुदरा

तो सीएसवी जो डाटासेट तालिका भर जाएगा:

यहाँ पहुँच तालिका हेडर का एक उदाहरण है। यह खुदरा हो सकता है या यह नहीं हो सकता है:

आइटम, लागत

यहाँ कोड मैं अब तक है, लेकिन यह पहुँच मेज पर लिख नहीं करता है। अगर मैं dtAccess को देखता हूं तो यह सही ढंग से दिखाता है।

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;"); 
       myConnection.Open(); 

       string queryString = "SELECT * from " + lblTable.Text; 

       OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection); 

       DataTable dtAccess = new DataTable(); 

       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       using (new OleDbCommandBuilder(adapter)) 
       { 
        adapter.Fill(dtAccess); 
        dtAccess.Merge(dtCSV); 
        adapter.Update(dtAccess); 
       } 

       myConnection.Close(); 
+0

यह पहले से ही गतिशील रूप से बनाया गया है, या आप इसे गतिशील रूप से बनाया जाना चाहते हैं? – McKay

+0

मैं इसे एक स्ट्रिंग में डायनैमिक रूप से बनाया जाना चाहता हूं ताकि मैं इसे एक सम्मिलित कमांड में उपयोग कर सकूं। कुछ ऐसा है: INSERT INTO [table] (डेटासेटहेडर) – Reg

+0

क्षमा करें @reg आप जो भी खोज रहे हैं उसमें आप अधिक स्पष्ट हो सकते हैं। क्या हम उदाहरण देख सकते हैं? – McKay

उत्तर

4

यह पता चल। यहां कोड का उपयोग किया गया है:

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Database.accdb\";Persist Security Info=False;"); 

       //command to insert each ASIN 
       OleDbCommand cmd = new OleDbCommand(); 

       //command to update each column (ASIN, Retail... from CSV) 
       OleDbCommand cmd1 = new OleDbCommand(); 

       //load csv data to dtCSV datatabe 
       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       // Now we will collect data from data table and insert it into database one by one 
       // Initially there will be no data in database so we will insert data in first two columns 
       // and after that we will update data in same row for remaining columns 
       // The logic is simple. 'i' represents rows while 'j' represents columns 

       cmd.Connection = myConnection; 
       cmd.CommandType = CommandType.Text; 
       cmd1.Connection = myConnection; 
       cmd1.CommandType = CommandType.Text; 

       myConnection.Open(); 

       for (int i = 0; i <= dtCSV.Rows.Count - 1; i++) 
       { 
        cmd.CommandText = "INSERT INTO " + lblTable.Text + "(ID, " + dtCSV.Columns[0].ColumnName.Trim() + ") VALUES (" + (i + 1) + ",'" + dtCSV.Rows[i].ItemArray.GetValue(0) + "')"; 

        cmd.ExecuteNonQuery(); 

        for (int j = 1; j <= dtCSV.Columns.Count - 1; j++) 
        { 
         cmd1.CommandText = "UPDATE " + lblTable.Text + " SET [" + dtCSV.Columns[j].ColumnName.Trim() + "] = '" + dtCSV.Rows[i].ItemArray.GetValue(j) + "' WHERE ID = " + (i + 1); 

         cmd1.ExecuteNonQuery(); 
        } 
       } 

       myConnection.Close(); 
+1

लाइन 'dtCSV = ds.Tables [0]' के लिए, आप चर 'ds' कहां प्राप्त करते हैं? –

0

एक्सेस में छिपी हुई सारणीएं हैं जो डेटाबेस में टेबल और कॉलम तक डेटाबेस पहुंच प्रदान करती हैं। उनके नाम एक्सेस संस्करण पर निर्भर हैं, लेकिन वे आम तौर पर सिस्टेबल्स की तरह कुछ हैं? यह थोड़ी देर हो गया है, लेकिन यदि आप "छिपी हुई टेबल दिखाते हैं" तो आपको उन्हें ढूंढने में सक्षम होना चाहिए।

+0

मुझे एक्सेस में सिस्टेबल्स के बारे में पता है लेकिन मैं डेटासेट से हेडर बनाने की कोशिश कर रहा हूं, न कि एक्सेस टेबल से। मेरे डेटासेट में केवल एक्सेस तालिका से 10 में से 4 कॉलम (भिन्न होंगे) शामिल होंगे। – Reg

0

दो datatable उसी संरचना आप, "सीएसवी" डेटाबेस तालिका datatable साथ DataTable merge कर सकते हैं तो उदाहरण के लिए यदि आप एक डेटा एडाप्टर का उपयोग कर एक datatable में डेटाबेस तालिका को पुनः प्राप्त कर सकते हैं:

string queryString = "SELECT * FROM sometable"; 
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 
DataTable dtAccess = new DataTable(); 
adapter.Fill(dtAccess); 

dtAccess.Merge(dtCSV); 

उसके बाद आप एक आदेश निर्माता के साथ पहुँच डेटाबेस तालिका में datatable की सामग्री लिख सकते हैं::

तो आप सीएसवी DataTable की सामग्री के साथ इस DataTable की सामग्री मर्ज कर सकते हैं

तो datatables उसी संरचना किसी भी समस्या के बिना काम करना चाहिए है ...

+0

यह लगभग काम करता है लेकिन यह एक्सेस टेबल पर नहीं लिखता है। क्या मैं कुछ भूल रहा हूँ? – Reg

+0

एडाप्टर के साथ डेटाटेबल भरने से पहले कमांडबिल्डर को प्रारंभ करने का प्रयास करें। – aleroot

+0

क्षमा करें मैं एक नोब हूँ। मुझे यह कैसे करना है? क्या उपरोक्त उपयोग कथन इसे किसी भी तरह से कॉल किए बिना प्रारंभ होता है? – Reg

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