SQLStatement.تنفيذ() - استعلامات متعددة في بيان واحد

StackOverflow https://stackoverflow.com/questions/80

  •  08-06-2019
  •  | 
  •  

سؤال

لقد كتبت بيانات الجيل النصي في SQL وتريد تنفيذه في بلدي برنامج Adobe AIR التطبيق:

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 موجود.يبدو أنه يبحث فقط في الاستعلام الأول (تصل إلى الفاصلة المنقوطة - إذا كنت إزالته ، يفشل الاستعلام).هل هناك طريقة للاتصال استعلامات متعددة في البيان ؟

هل كانت مفيدة؟

المحلول

أنا الجرح باستخدام هذا.بل هو نوع من الإختراق ، لكنه في الواقع يعمل بشكل جيد جدا.

الشيء الوحيد الذي عليك أن تكون حذرا جدا مع الفاصلة المنقوطة.: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());
}

نصائح أخرى

على سكليتي API لديه وظيفة يسمى شيء من هذا القبيل sqlite_prepare الذي يأخذ واحد بيان ويعد ذلك من أجل التنفيذ ، أساسا تحليل SQL و تخزينها في الذاكرة.وهذا يعني أن SQL فقط ليتم إرسالها مرة واحدة إلى محرك قاعدة البيانات حتى ولو يتم تنفيذ العبارة مرات عديدة.

على أي حال, بيان واحد استعلام SQL, هذا فقط القاعدة.الهواء SQL المعهد لا يسمح بإرسال الخام SQL إلى SQLite واحدة فقط البيانات و السبب المرجح أن يستخدم الهواء sqlite_prepare وظيفة عندما يتحدث سكليتي.

ماذا عن إجراء محدد شيئا قليلا أكثر تعقيدا مثل "; " الذي لن يظهر كل ذلك في كثير من الأحيان.لديك فقط للتأكد من عند إنشاء ملف لديك خط العودة أو اثنين هناك.أنا في نهاية المطاف وضع اثنين " " إلى إنشاء الملفات الذي يعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top