2008-08-05 35 views
7

Bir SQL Server veritabanından (biri sunucudan (server.db) ve istemcide depolama alanı olarak kullanılan (client.db) 2 SQLite veritabanım var. Sunucu veritabanındaki verileri kullanarak istemci veritabanında çeşitli senkronizasyon sorguları gerçekleştirmem gerekiyor. Örneğin, client.db tRole tablosundaki tüm satırları silmek ve server.db tRole tablosundaki tüm satırlarla yeniden doldurmak istiyorum.Aynı anda birden çok SQLite veritabanını kullanma

Başka bir örnek, fileID tablosunun server.db tFile tablosunda bulunmadığı tüm satırları client.db tFile tablosunda silmek istiyorum.

SQL Server'da tabloyu yalnızca veritabanının adıyla önekleyebilirsiniz. Bunu, Adobe Air kullanarak SQLite'de yapmak için var mı?

+0

Nasıl yani? SQLite, başka bir veritabanı eklemenize izin veren bir 'attach' anahtar kelimesine sahiptir. Ve Theo'nun cevabı, Air'in ilgili bir API çağrısına sahip olduğunu gösteriyor. Özellikle "veritabanı seviyesinden" dediğinizde bazı eksiklikler var mı? – spaaarky21

cevap

7

Sadece HAVA SQL API baktım ve tam olarak neye ihtiyacınız görünüyor SQLConnection üzerinde attach yöntem var.

Bunu test etmedim ama belgelere göre çalışması lazım:

var connection : SQLConnection = new SQLConnection(); 

connection.open(firstDbFile); 
connection.attach(secondDbFile, "otherDb"); 

var statement : SQLStatement = new SQLStatement(); 

statement.connection = connection; 
statement.text = "INSERT INTO main.myTable SELECT * FROM otherDb.myTable"; 
statement.execute(); 

bu kod snipplet hatalar var olabilir, son zamanlarda HAVA SQL API ile çok çalışmadım. open ile açılmış olan veritabanının tablolarının main.tableName kullanılarak erişilebilir olduğuna dikkat edin, ilişikteki herhangi bir veritabanına herhangi bir ad verilebilir (yukarıdaki örnekte otherDb).

1

Birden çok veritabanını Sqlite'de bir kerede açmak mümkündür, ancak Flex/AIR'den çalışırken yapılabilecekleriniz şüpheli. Komut satırı istemcisinde, ATTACH DATABASE path/to/other.db AS otherDb çalıştırın ve sonra bu veritabanındaki tablolara, MySQL veya SQL Server'daki gibi otherDb.tableName olarak başvurabilirsiniz.

Ekli bir veritabanındaki tablolar, sözdizimi veritabanı-adı.table-name kullanılarak belirtilebilir.

ATTACH DATABASE documentation at sqlite.org

0

bu kod bir iş olabilir, bu beni yazma şudur: "veritabanı düzeyinden Bunu yapmanın yolu bile yok"

package lib.tools 

import flash.utils.ByteArray; 
import flash.data.SQLConnection; 
import flash.data.SQLStatement; 
import flash.data.SQLResult; 
import flash.data.SQLMode; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
import flash.filesystem.File; 
import mx.core.UIComponent; 
import flash.data.SQLConnection; 

public class getConn { 
    public var Conn:SQLConnection; 

    public function getConn(database:Array) {  
     Conn = new SQLConnection(); 
     var Key:ByteArray = new ByteArray(); 
     Key.writeUTFBytes("Some16ByteString"); 
     Conn.addEventListener(SQLErrorEvent.ERROR, createError); 
     var dbFile:File = File.applicationDirectory.resolvePath(database[0]); 
     Conn.open(dbFile); 
     if(database.length > 1) { 
      for(var i:Number = 1; i < database.length; i++) { 
       var DBname:String = database[i]; 
       Conn.attach(DBname.split("\.")[0], File.applicationDirectory.resolvePath(DBname)); 
      } 
     } 
     Conn.open(dbFile, SQLMode.CREATE, false, 1024, Key); 
    } 

    private function createError(event:SQLErrorEvent):void { 
     trace("Error code:", event.error.details); 
     trace("Details:", event.error.message); 
    } 

    public function Rs(sql:Array):Object { 
     var stmt:SQLStatement = new SQLStatement(); 
     Conn.begin(); 
     stmt.sqlConnection = Conn; 
     try { 
      for(var i:String in sql) {   
       stmt.text = sql[i]; 
       stmt.execute(); 
      } 
      Conn.commit(); 
     } catch(error:SQLErrorEvent) { 
      createError(error); 
      Conn.rollback(); 
     }; 
     var result:Object =stmt.getResult(); 
     return result; 
    } 
} 
İlgili konular