2012-11-07 1 views
1

이진 파일을 가져와 웹 SQL 데이터베이스에 값을 삽입하는 간단한 페이지를 만들려고합니다. 내 모든 디버그 메시지를 제거하는 코드를 다시 제거했지만 본질적으로 코드가 실행될 나타납니다Web SQL 데이터베이스에 데이터를 삽입하는 데이 Javascript 코드에 어떤 문제가 있습니까?

function bin2dbfunc() 
{ 
    var result, n, aByte, byteStr; 
    var i=0; 
    var sql = new Array(); 

    result = fr.result; //Input file 

    for (n = 0; n < result.length; ++n) 
    { 
     aByte = result.charCodeAt(n); 
     byteStr = aByte.toString(16); 
     if (byteStr.length < 2) 
     { 
      byteStr = "0" + byteStr; 
     } //Format to add leading 0 for hex values 

     //Looping through taking each byte read from file and adding to array 

     //sql[i] = aByte; //Value 
     sql[i] = byteStr; //String 


     //When completed one row of database run single SQL insert statement with array contents 
     if(i==15) 
     { 
      i=0; //Clear counter for next row 
      db.transaction(function (tx) 
      { 
       tx.executeSql('INSERT INTO binary_data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [sql[0], sql[1], sql[2], sql[3], sql[4], sql[5], sql[6], sql[7], sql[8], sql[9], sql[10], sql[11], sql[12], sql[13], sql[14], sql[15]]); 
      }, function (tx, err) { 
       document.getElementById("result3").innerHTML += 'ERROR '; //Display error message if SQL not run successfully 
      }); 
     } 
     else 
     { 
      i++; //Otherwise increment counter 
     } 
    } 
} 

: 이 내가 데이터를 삽입하기 위해 사용하고있는 기능입니다. 6 행의 데이터가있는 2 진 파일을 사용하고 있지만 코드는 데이터의 마지막 행을 데이터베이스에 6 회 삽입합니다. 누구나 내가 잘못 가고있는 곳을 찾아 낼 수 있습니까?

+0

범위 지정 문제와 같은 소리 - 비동기 함수 인'db.transaction()'입니까? –

+0

변수'i'는'tx.executeSql'가 오류를 던지면 증가하지 않습니다. 그게 될 수 있을까요? – Bruno

답변

0

변수는 JavaScript 클로저에서 값이 아닌 참조로 캡처됩니다 (배열과 같은 객체에도 있지만 프리미티브 값에도 마찬가지 임). 즉, db.transaction에 전달 된 함수는 실행될 때 sql의 현재 값을 사용합니다. 귀하의 경우 비동기 적으로 실행되므로 bin2dbfunc이 반환 된 후 sql 값을 사용하는 것으로 나타납니다 (결국 데이터의 마지막 행으로 끝나는 이유가 설명됩니다).

당신이 바로 그 사람이 사용되었는지 확인하기 위해 sql의 값을 복사 할 수 있습니다

function transactionCallback(sql_) { 
    var sql = sql_.slice(0); // copy 
    return function(tx) { 
    tx.executeSql(…, sql); 
    }; 
} 

db.transaction(transactionCallback(sql), …); 

또는

function transactionCallback(sql) { 
    return function(tx) { 
    tx.executeSql(…, sql); 
    }; 
} 

db.transaction(transactionCallback(sql), …); 
sql = []; 

당신이 sql의 값을 나중에 필요로하지 않는 bin2dbfunc에 있음; 이 두 번째 해결 방법을 사용하면 i을 제거하고 pushlength을 기반으로 한보다 세련된 솔루션을 사용할 수 있습니다.

+0

감사합니다. 문제가 해결되었습니다. 나는 더 많은 자바 스크립트를 시도하기 전에 더 많은 독서를해야 할 것입니다. 이것은 아이디어를 시험해보기위한 예제의 매쉬입니다. – LogicTom