2009-03-12 16 views
6
के माध्यम से ADO का उपयोग कर एमएस एक्सेस डेटाबेस में डेटा सम्मिलित करना

[संपादित करें 2: अधिक जानकारी और नीचे जवाब में डिबगिंग ...]समस्या पायथन

मैं एमएस एक्सेस पाठ की एक श्रृंखला में डेटाबेस निर्यात करने के लिए एक अजगर स्क्रिप्ट लिख रहा हूँ फ़ाइलों को अधिक सार्थक संस्करण नियंत्रण की अनुमति देने के लिए (मुझे पता है - क्यों पहुंच? मैं मौजूदा समाधान का उपयोग क्यों नहीं कर रहा हूं? मान लें कि प्रतिबंध तकनीकी प्रकृति का नहीं हैं)।

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

मैं प्रत्येक पंक्ति पर एक सूची के साथ एक पाठ फ़ाइल में प्रत्येक तालिका की सामग्री निर्यात कर रहा हूँ, इसलिए जैसे:

[-9, u'No reply'] 
[1, u'My home is as clean and comfortable as I want'] 
[2, u'My home could be more clean or comfortable than it is'] 
[3, u'My home is not at all clean or comfortable'] 

और निम्नलिखित समारोह कहा फ़ाइल आयात करने:

import os 
import sys 
import datetime 
import comtypes.client as client 
from ADOconsts import * 
from access_consts import * 

class Db: 
    def create_table_contents(self, verbosity = 0): 
     conn = client.CreateObject("ADODB.Connection") 
     rs = client.CreateObject("ADODB.Recordset") 
     conn.ConnectionString = self.new_con_string 
     conn.Open() 
     for fname in os.listdir(self.file_path): 
      if fname.startswith("Table_"): 
       tname = fname[6:-4] 
       if verbosity > 0: 
        print "Filling table %s." % tname 
       conn.Execute("DELETE * FROM [%s];" % tname) 
       rs.Open("SELECT * FROM [%s];" % tname, conn, 
         adOpenDynamic, adLockOptimistic) 
       f = open(self.file_path + os.path.sep + fname, "r") 
       data = f.readline() 
       print repr(data) 
       while data != '': 
        data = eval(data.strip()) 
        print data[0] 
        print rs.Fields.Count 
        rs.AddNew() 
        for i in range(rs.Fields.Count): 
         if verbosity > 1: 
          print "Into field %s (type %s) insert value %s." % (
           rs.Fields[i].Name, str(rs.Fields[i].Type), 
           data[i]) 
         rs.Fields[i].Value = data[i] 
        data = f.readline() 
        print repr(data) 
        rs.Update() 
       rs.Close() 
     conn.Close() 

सब कुछ ठीक काम करता है सिवाय इसके कि संख्यात्मक मान (डबल और int) शून्य के रूप में डाले जा रहे हैं। इस मुद्दे पर कोई समस्या है कि समस्या मेरे कोड, eval, comtypes, या एडीओ के साथ है या नहीं?

संपादित करें: मैंने संख्याओं को सम्मिलित करने में समस्या को ठीक कर दिया है - उन्हें कास्टिंग के रूप में कास्टिंग (!) दोनों डबल और पूर्णांक फ़ील्ड के लिए समस्या को हल करने लगता है।

हालांकि, अब मेरे पास एक अलग मुद्दा है जिसे पहले उपरोक्त द्वारा अस्पष्ट किया गया था: प्रत्येक पंक्ति में पहला फ़ील्ड डेटा प्रकार के बावजूद 0 पर सेट किया जा रहा है ... कोई विचार?

उत्तर

4

और एक उत्तर मिला।

rs = client.CreateObject("ADODB.Recordset") 

होने की जरूरत है:

rs = client.CreateObject("ADODB.Recordset", dynamic=True) 

अब मैं सिर्फ क्यों गौर करने की जरूरत है। बस उम्मीद है कि यह प्रश्न किसी और को कुछ घंटों बचाता है ...

+0

और समाधान का शेष "rs.Fields [i]। वैल्यू = डेटा [i]" से "rs. फ़ील्ड [i] .Value = str (डेटा [i])" को बदलना था? – BIBD

+0

नहीं, नहीं। स्पष्ट रूप से कहा जाना चाहिए था: गतिशील = सही जोड़ना संख्यात्मक मान दोनों के साथ मूल मुद्दा, और परिवर्तनीय परिणामों के साथ अनुवर्ती समस्या हल। एक बार यह जगह हो जाने के बाद, rs.Fields [i]। वैल्यू = डेटा [i] ठीक काम किया और वास्तव में संख्याओं को कास्टिंग के रूप में स्ट्रिंग्स ने एक प्रकार की मेल नहीं खाई त्रुटि को फेंक दिया। – mavnn

+0

केवल, मैं जवाब पर स्पष्ट नहीं था। इस बिंदु पर मैं स्वीकार करता हूं कि स्वीकृत के रूप में अपना स्वयं का जवाब चिह्नित करें। – BIBD

0

data[i] एक स्ट्रिंग के रूप में माना जा रहा है? यदि आप rs.Fields[i].Value सेट करते हैं तो विशेष रूप से इसे int/double के रूप में डालने पर क्या होता है?

इसके अलावा, जब आप सेट होने के बाद rs.Fields[i].Value की सामग्री मुद्रित करते हैं तो क्या होता है?

+0

संपादन देखें - विचित्र रूप से मुझे इसे काम करने के लिए int/double से स्ट्रिंग से विशेष रूप से डालने की आवश्यकता है ... – mavnn

0

अभी तक एक पूरा उत्तर नहीं है, लेकिन यह अद्यतन के दौरान एक समस्या प्रतीत होता है। मैं प्रविष्टि प्रक्रिया है जिसके (अपडेट की जा रही एक ही पंक्ति का उदाहरण) के बाद उत्पन्न में कुछ और डिबगिंग कोड जोड़ दिया है:

Inserted into field ID (type 3) insert value 1, field value now 1. 
Inserted into field TextField (type 202) insert value u'Blah', field value now Blah. 
Inserted into field Numbers (type 5) insert value 55.0, field value now 55.0. 
After update: [0, u'Blah', 55.0] 

प्रत्येक में अंतिम मान "सम्मिलित किए ..." लाइन बुला का परिणाम है rs.Fields [i]। rs.Update() को कॉल करने से पहले वैल्यू। "आफ्टर ..." लाइन rs.Fields को कॉल करने के परिणाम दिखाती है [i]। Rs.Update() को कॉल करने के बाद वैल्यू।

और भी परेशान करने वाला यह है कि यह विश्वसनीय रूप से विफल नहीं है। उसी पर ठीक उसी कोड को फिर से चलाकर रिकॉर्ड कुछ मिनट बाद उत्पन्न:

Inserted into field ID (type 3) insert value 1, field value now 1. 
Inserted into field TextField (type 202) insert value u'Blah', field value now Blah. 
Inserted into field Numbers (type 5) insert value 55.0, field value now 55.0. 
After update: [1, u'Blah', 2.0] 

आप देख सकते हैं, परिणाम जब तक आप उन्हें, फिर ... नहीं प्रतिबद्ध विश्वसनीय हैं।

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