2010-11-30 81 views
0

我有一個函數構建一個sql查詢,然後將其插入到客戶端的light sql中。縮短循環的動態SQL查詢

我認爲即時通訊使用許多for循環,我將如何使這個更短?

function insert(dataBase,table,row){ 
    var j = 0; 

    var sqlQueryArray = []; 

    sqlQueryArray[j++] = 'INSERT INTO '; 
    sqlQueryArray[j++] = table 
    sqlQueryArray[j++] = ' (' 

    for (var i = row.length - 2; i >= 0; i--){ 
     sqlQueryArray[j++] = row[i].id + ','; 
    }; 

    sqlQueryArray[j++] = row[(row.length - 1)].id + ''; 
    sqlQueryArray[j++] = ')' 
    var sqlQueryString = ' VALUES '; 

    for (var i = row.length - 2; i >= 0; i--){ 
     sqlQueryArray[j++] = '?, '; 
    }; 

    sqlQueryArray[j++] = '?'; 
    sqlQueryArray[j++] = ');' 

    for (var i = 0; i < sqlQueryArray.length; i++){ 
     sqlQueryString += sqlQueryArray[i]; 
    } 
    var rowArray = [] 
    for (var i = row.length - 1; i >= 0; i--){ 
     rowArray[i] = row[i].val; 
    }; 

    dataBase.openDatabase.transaction(
     function (transaction) { 
      transaction.executeSql(sqlQueryString, 
       rowArray, 
       dataBase.nullSQLHandler, dataBase.QueryError); 
     } 
    ); 
} 

回答

1

假設,你可以做這樣的事情:

var insertStatement = 
    'INSERT INTO ' + table + 
    ' (' + rows.map(function (row) { return row.id; }).join(', ') + ')' + 
    ' VALUES (' + rows.map(function() { return '?'; }).join(', ') + ')'; 

無論您應該是向左作爲練習讀者:)

編輯:我只是在註釋中注意到另一個答案,您將它發送到服務器執行。你當然應該而不是這樣做,因爲用戶可以輕鬆地提交他們自己的SQL並對數據庫造成各種破壞。您不應該相信通過網絡收到的任何數據。

1

當在應用程序中創建動態SQL時,事情就會被釋放並且兒童被吃掉。

爲了多種安全性和性能方面的原因(更不用說可讀性/可維護性),您應該真正使用參數化的SP作爲參數。

+0

您的權利我可能更多的查詢建立到服務器。它會使sql更加異步。 – 2010-11-30 03:04:25

+0

噢...你正在發送查詢到服務器執行? – harto 2010-11-30 03:08:28

+0

現在我在客戶端做這件事,但服務器是一個node.js服務器。所以我可能只是發送(表,行)並獲得一個值數組的字符串。 – 2010-11-30 03:10:48

0

首先,我認爲你最好不要手動跟蹤索引(j++)。使用sqlQueryArray.push()在sqlQueryArray的末尾插入元素。

然後,簡化你的代碼,你可以創建一個返回您的自定義SQL通過你row變量作爲參數的函數,用您可以生成所有的?標記的INSERT INTO條款。您使用的是相對較新的瀏覽器