2009-05-30 12 views
7

मैं SQLite के साथ थोक कैसे सम्मिलित करूं?मैं SQLite के साथ थोक कैसे सम्मिलित करूं?

मैंने इसे देखा और ऐसा लगता है जैसे मैं एक चयन कथन के साथ एक सम्मिलित करता हूं। मैंने googled, उदाहरणों को देखा और वे सभी दिखते हैं कि वे एक टेबल से दूसरे डेटा में डेटा कॉपी कर रहे हैं या SQLite के साथ संगत नहीं है। मैं की तरह

"INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_media_date) " + 
"VALUES(@mediaId, @catagory, @current_media_date)"; 
where the value of recipientId is the watcher from each of 
"SELECT watcher FROM userwatch WHERE [email protected]"; 

मैं नीचे दिए गए कोड की कोशिश की कुछ करना चाहता हूँ और मैं त्रुटि "SQLite त्रुटि ऐसी कोई स्तंभ: द्रष्टा" मिल (

 command.CommandText = 
      "CREATE TABLE if not exists user_msg_media(" + 
      "msgId  INTEGER PRIMARY KEY, " + 
      "recipientId INTEGER, " + 
      "mediaId  INTEGER, " + 
      "catagory  INTEGER, " + 
      "current_date DATE);"; 
     command.ExecuteNonQuery(); 

     //user media 
     command.CommandText = 
      "CREATE TABLE if not exists user_watch(" + 
      "indx INTEGER PRIMARY KEY, " + 
      "watcher INTEGER, " + 
      "watched INTEGER);"; 
     command.ExecuteNonQuery(); 
     //... 

    command.CommandText = "SELECT watcher FROM user_watch WHERE watched=:watched;"; 
    command.Parameters.Add(":watched", DbType.Int64).Value = 1; 
    command.ExecuteNonQuery(); //is ok 

    command.CommandText = 
     "INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_media_date) " + 
     "SELECT watcher, :mediaId, :category, :current_media_date" + 
     "FROM user_watch WHERE watched=:watched;"; 
    command.Parameters.Add(":mediaId", DbType.Int64).Value = 0; 
    command.Parameters.Add(":category", DbType.Int64).Value = 0; 
    command.Parameters.Add(":current_media_date", DbType.Int64).Value = 0; 
    command.Parameters.Add(":watched", DbType.Int64).Value = 1; 
    command.ExecuteNonQuery(); 
+0

के लिए IENumerable लागू करता है क्या आप System.Data.Sqlite का उपयोग कर रहे हैं? –

+0

तालिका usr_msg_media के लिए CREATE को नोट करें current_date नामक कॉलम बनाता है, लेकिन INSERT इसके बजाय current_media_date सेट करने का प्रयास करता है: मुझे विश्वास है कि इस त्रुटि को SQLite द्वारा गलत निदान किया जा रहा है (यह भ्रमित हो जाता है और दावा करता है कि गुम कॉलम इसके बजाय दर्शक है), क्योंकि मैं पुन: उत्पन्न कर सकता हूं ग़लत त्रुटि संदेश - लेकिन अगर मैं वास्तविक त्रुटि को ठीक करता हूं, तो यह काम करता है, मेरे उत्तर में पायथन नमूना कोड देखें। –

उत्तर

2

SQLite @variable अंकन का समर्थन नहीं करता है, लेकिन का उपयोग कर नामित-प्लेसहोल्डर शैली के रूप में अजगर स्पष्टता के लिए SQLite के बंधन) इस काम करना चाहिए द्वारा समर्थित:

INSERT INTO user_msg_media (userId, mediaId, catagory, current_media_date) 
SELECT watcher, :mediaId, :category, :current_media_date 
FROM userwatch WHERE watched=:watched 

संपादित करें: SQLite misdiagnosing जा करने के लिए क्या स्तंभ का नाम गलत है लगता है। स्तंभ नाम सब तय के साथ, निम्नलिखित पायथन कोड मेरे लिए काम करता (यकीन नहीं क्या अन्य भाषा का उपयोग कर रहे हैं, पायथन के क्या handiest मेरे लिए SQLite के साथ बातचीत करने के लिए):

import sqlite3 as sq 

con = sq.connect(':memory:') 
cur = con.cursor() 
cur.execute("CREATE TABLE if not exists user_msg_media(" + 
      "msgId  INTEGER PRIMARY KEY, " + 
      "recipientId INTEGER, " + 
      "mediaId  INTEGER, " + 
      "catagory  INTEGER, " + 
      "current_date DATE)") 
cur.execute("CREATE TABLE if not exists user_watch(" + 
      "indx INTEGER PRIMARY KEY, " + 
      "watcher INTEGER, " + 
      "watched INTEGER)") 

cur.execute("INSERT INTO user_watch VALUES (1, 2, 3)") 

cur.execute("SELECT watcher FROM user_watch WHERE watched=:watched", 
      dict(watched=3)) 
print cur.fetchall() 

print cur.execute("INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_date) " + 
     "SELECT watcher, :mediaId, :category, :current_media_date " + 
     "FROM user_watch WHERE watched=:watched;", 
     dict(mediaId=0, category=0, current_media_date=0, watched=3) 
) 

cur.execute("SELECT * FROM user_msg_media") 
print cur.fetchall() 

लेकिन अगर मैं अपने एसक्यूएल में बेमेल पुन: पेश जैसे current_date vs current_media_date, मैं इसे गलत-निदान करने के लिए प्राप्त कर सकता हूं कि गायब कॉलम watcher है, भले ही वह कॉलम वास्तव में ठीक है। इस सही कोड को अपनी पसंदीदा भाषा में वापस डालने का प्रयास करना चाहते हैं और देखें कि यह कैसा व्यवहार करता है?

+0

मैंने कोशिश की, मुझे ऐसी कोई कॉलम त्रुटि नहीं मिली। –

+0

यह बताता है कि आपके कॉलम नामों में से एक गलत वर्तनी है - तालिका 'user_msg_media' तालिका के लिए' तालिका बनाएं 'कथन क्या है? –

+0

(यानी, यह मानते हुए कि आप जो भी भाषा उपयोग कर रहे हैं, वह प्लेसहोल्डर्स के लिए एक ही वाक्यविन्यास का उपयोग करता है और आप सही निर्देश, हैश, या जो भी हो) में गुजर रहे हैं ... –

8

मैंने SQLite में थोक प्रविष्टियों को सुविधाजनक बनाने में सहायता के लिए एक कक्षा लिखी। उम्मीद है कि यह उपयोगी है:

http://procbits.com/2009/09/08/sqlite-bulk-insert/

-JP

1

मैं StackOverflow पर हमारे मित्रों से Dapper ORM उपयोग करने का सुझाव होगा। यदि आप प्रदर्शन पर अनुभाग देखते हैं, तो आप डैपर से ज्यादा तेज़ नहीं हो सकते हैं।

एक कमांड निष्पादित कई बार
वही हस्ताक्षर आप आसानी से और कुशलता से एक कमांड कई बार

उदाहरण उपयोग (थोक लोड आंकड़ों के उदाहरण के लिए) निष्पादित करने के लिए अनुमति देता है:

connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)", 
    new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } } 
); // 3 rows inserted: "1,1", "2,2" and "3,3" 

यह किसी भी पैरामीटर के लिए काम करता है जो कुछ टी

+0

हाहा, देर से 2.5 साल। हालांकि मैं हूँ डैपर (या चयन) और अपने स्वयं के ओएम (अन्य सभी चीज़ों के लिए) का उपयोग करके जो सबसोनिक से गधे को मारता है और अन्य क्रैस्ड ओम्स –

+1

मुझे खुशी है कि आपको डैपर के साथ सफलता मिल रही है। मैंने इसे हमारे उत्पादन में शामिल करने की सिफारिश की है। आवेदन। – BrokeMyLegBiking

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

  • कोई संबंधित समस्या नहीं^_^