SQLStatement.execute () - एक कथन में एकाधिक प्रश्न

मैंने SQL में डेटाबेस जनरेशन स्क्रिप्ट लिखी है और इसे अपने एडोब एयर आवेदन:

Create Table tRole (
    roleID integer Primary Key
    ,roleName varchar(40)
);
Create Table tFile (
    fileID integer Primary Key
    ,fileName varchar(50)
    ,fileDescription varchar(500)
    ,thumbnailID integer
    ,fileFormatID integer
    ,categoryID integer
    ,isFavorite boolean
    ,dateAdded date
    ,globalAccessCount integer
    ,lastAccessTime date
    ,downloadComplete boolean
    ,isNew boolean
    ,isSpotlight boolean
    ,duration varchar(30)
);
Create Table tCategory (
    categoryID integer Primary Key
    ,categoryName varchar(50)
    ,parent_categoryID integer
);
...

मैं निम्न विधियों का उपयोग करके एडोब एयर में इसे निष्पादित करता हूं:

public static function RunSqlFromFile(fileName:String):void {
    var file:File = File.applicationDirectory.resolvePath(fileName);
    var stream:FileStream = new FileStream();
    stream.open(file, FileMode.READ)
    var strSql:String = stream.readUTFBytes(stream.bytesAvailable);
    NonQuery(strSql);
}

public static function NonQuery(strSQL:String):void {
    var sqlConnection:SQLConnection = new SQLConnection();
    sqlConnection.open(File.applicationStorageDirectory.resolvePath(DBPATH));
    var sqlStatement:SQLStatement = new SQLStatement();
    sqlStatement.text = strSQL;
    sqlStatement.sqlConnection = sqlConnection;
    try {
        sqlStatement.execute();
    } catch (error:SQLError) {
        Alert.show(error.toString());
    }
}

कोई त्रुटि उत्पन्न नहीं होती है, हालांकि केवल tRole मौजूद है। ऐसा लगता है कि यह केवल पहली क्वेरी को देखता है (अर्धविराम तक- यदि मैं इसे हटा देता हूं, तो क्वेरी विफल हो जाती है)। क्या एक कथन में एकाधिक प्रश्नों को कॉल करने का कोई तरीका है?

0
जोड़ा संपादित
विचारों: 7

3 उत्तर

मैं इसका उपयोग कर घायल हो गया। यह एक प्रकार का हैक है, लेकिन यह वास्तव में बहुत अच्छी तरह से काम करता है। केवल एक चीज है कि आपको अपने अर्धविरामों से बहुत सावधान रहना होगा। : डी

var strSql:String = stream.readUTFBytes(stream.bytesAvailable);      
var i:Number = 0;
var strSqlSplit:Array = strSql.split(";");
for (i = 0; i < strSqlSplit.length; i++){
    NonQuery(strSqlSplit[i].toString());
}
0
जोड़ा
सिर्फ एक एहसास क्षेत्र में एक अर्धविराम दिखाई देने पर यह कितना बुरा असफल होगा।
जोड़ा लेखक Shawn, स्रोत

SQLite API में एक फ़ंक्शन है जिसे sqlite_prepare जैसे कुछ कहा जाता है जो एक कथन और इसे निष्पादन के लिए तैयार करता है, अनिवार्य रूप से SQL को पार्स करना और स्मृति में संग्रहीत करना। इसका मतलब यह है कि एसक्यूएल को डेटाबेस इंजन में केवल एक बार भेजा जाना चाहिए, भले ही कथन कई बार निष्पादित किया गया हो।

वैसे भी, एक कथन एक एकल SQL क्वेरी है, यह सिर्फ नियम है। एआईआर एसक्यूएल एपीआई कच्चे एसक्यूएल को SQLite, केवल एकल कथन भेजने की अनुमति नहीं देता है, और कारण यह है कि एआईआर SQLite से बात करते समय sqlite_prepare फ़ंक्शन का उपयोग करता है।

0
जोड़ा

अपने डेलीमीटर को कुछ और जटिल बनाने के बारे में क्या है जैसे "; \ n" जो अक्सर दिखाई नहीं देता है। आपको बस यह सुनिश्चित करना होगा कि फाइल बनाने के दौरान आपके पास लाइन रिटर्न या दो हो। मैं अपनी फाइलों के निर्माण में दो "\ n \ n" डालता हूं जो अच्छी तरह से काम करता है।

0
जोड़ा