SQLStatement.execute () - πολλά ερωτήματα σε μία δήλωση

ψήφοι
35

Έχω γράψει μια γενιά βάση δεδομένων σενάριο σε SQL και θέλετε να το εκτελέσει κατά τη γνώμη μου AIR Adobe εφαρμογής:

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
);
...

Θα εκτελέσει αυτό το Adobe AIR χρησιμοποιώντας τις ακόλουθες μεθόδους:

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υπάρχει. Φαίνεται ότι φαίνεται μόνο στο πρώτο ερώτημα (μέχρι την semicolon- αν μπορώ να το αφαιρέσετε, το ερώτημα αποτυγχάνει). Είναι ένας τρόπος για να καλέσετε πολλά ερωτήματα σε μια κατάσταση εκεί;

Δημοσιεύθηκε 01/08/2008 στις 14:57
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
19

Θα διαλυθεί με τη χρήση αυτή. Είναι ένα είδος ενός hack, αλλά λειτουργεί πραγματικά πολύ καλά. Το μόνο πράγμα που είναι ότι πρέπει να είμαστε πολύ προσεκτικοί με ερωτηματικά σας. : D

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());
}
Απαντήθηκε 01/08/2008 στις 17:09
πηγή χρήστη

ψήφοι
9

Η SQLite API έχει μια λειτουργία που ονομάζεται κάτι σαν sqlite_prepareτις οποίες λαμβάνει μία δήλωση και την προετοιμάζει για την εκτέλεση, κατ 'ουσίαν, την ανάλυση του SQL και αποθήκευση στη μνήμη. Αυτό σημαίνει ότι ο SQL έχει μόνο να σταλεί μία φορά στο μηχανισμό διαχείρισης βάσεων δεδομένων, ακόμη και αν η δήλωση εκτελείται πολλές φορές.

Εν πάση περιπτώσει, η δήλωση είναι μια ενιαία SQL ερώτημα, αυτό είναι ακριβώς ο κανόνας. Η AIR SQL API δεν επιτρέπει την αποστολή των πρώτων SQL για SQLite, μόνο και μόνο δηλώσεις, και ο λόγος είναι, πιθανότατα, η AIR χρησιμοποιεί τη sqlite_prepareλειτουργία όταν μιλά για SQLite.

Απαντήθηκε 13/08/2008 στις 17:09
πηγή χρήστη

ψήφοι
3

Τι γίνεται κάνοντας κάτι οριοθέτη σας λίγο πιο περίπλοκη, όπως «? \ N» που δεν θα εμφανιστούν όλα αυτά συχνά. Απλά πρέπει να διασφαλιστεί κατά τη δημιουργία του αρχείου έχετε μια επιστροφή γραμμή ή δύο εκεί μέσα. Θα καταλήξετε την τοποθέτηση δύο «\ n \ n» στη δημιουργία των αρχείων μου, η οποία λειτουργεί καλά.

Απαντήθηκε 22/09/2010 στις 16:37
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more