前提・実現したいこと
html、SQL.js、SQLiteを使用して、社内のフォルダにDBの内容が見られるhtmlを置いておけば、アクセスした人がサーバーを毎度つながずにみられる方法を試しています。
前回の質問でSQL.jsで実装ができる事を確認できたので、ここから使いやすいようにしたいと考え、
1)DBの内容を一つずつ取り出して表にしたい
2)閲覧するDBのテーブルは決まっているので、フォルダを選択する手間を無くしたい
と考えています。
発生している問題・エラーメッセージ
1)についてとりあえずログで一つずつ取り出せるようにしようと、前回の質問でいただいたコードに下記のコードを書き加えたコードを実装したところ、undefinedと表示される状態でした。
html
1<div> 2 <input id="file-field" type="file" accept=".sqlite3"> 3</div> 4 5<div> 6 <input id="query-field" placeholder="SELECT * FROM users;" disabled> 7 8 <button id="execute-button" disabled>EXECUTE QUERY</button> 9</div> 10 11<div> 12 <pre id="result-text"></pre> 13</div> 14 15<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.min.js"></script> 16<script> 17initSqlJs({ 18 locateFile: (file) => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.wasm`, 19}).then((SQL) => { 20 let db = null; 21 22 const fileField = document.querySelector("#file-field"); 23 const queryField = document.querySelector("#query-field"); 24 const executeButton = document.querySelector("#execute-button"); 25 const resultText = document.querySelector("#result-text"); 26 27 fileField.addEventListener("change", (event) => { 28 const file = fileField.files.item(0); 29 30 if (!file) { 31 return; 32 } 33 34 const fileReader = new FileReader(); 35 36 fileReader.addEventListener("load", (event) => { 37 db = new SQL.Database(new Uint8Array(fileReader.result)); 38 39 fileField.disabled = true; 40 41 queryField.disabled = false; 42 43 executeButton.disabled = false; 44 }); 45 46 fileReader.readAsArrayBuffer(file); 47 }); 48 49 executeButton.addEventListener("click", (event) => { 50 const rows = db.exec(queryField.value); 51 52//ここから新しく付け加えたコード 53 for (var i in rows) { 54 console.log(rows[i].id); 55 } 56//ここまで新しく付け加えたコード 57 58 resultText.innerHTML = JSON.stringify(rows, null, " "); 59 }); 60}); 61</script>
2)を試したところ
fileReader.readAsArrayBuffer(file);の行部分で下記のエラーが出ました。
調べてみたところinputから取得されたものを使用すること前提のものなので実装は難しいのでしょうか?
html
1 2<div> 3 <pre id="result-text"></pre> 4</div> 5 6<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.min.js"></script> 7<script> 8initSqlJs({ 9 locateFile: (file) => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.6.1/sql-wasm.wasm`, 10}).then((SQL) => { 11 let db = null; 12 13 const queryField = document.querySelector("#query-field"); 14 const executeButton = document.querySelector("#execute-button"); 15 const resultText = document.querySelector("#result-text"); 16 17 const file = "users.sqlite3"; 18 const fileReader = new FileReader(); 19 20 fileReader.addEventListener("load", (event) => { 21 db = new SQL.Database(new Uint8Array(fileReader.result)); 22 23 }); 24 25 fileReader.readAsArrayBuffer(file); 26 27 28 executeButton.addEventListener("click", (event) => { 29 const rows = db.exec("SELECT * FROM users;"); 30 31 resultText.innerHTML = JSON.stringify(rows, null, " "); 32 }); 33}); 34</script> 35コード
↓エラー
Uncaught (in promise) TypeError: Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'.
該当のソースコード
Plaintext
1. 2├─ index.html 3└─ users.sqlite3 4
SQLは前回の質問と同様のものになっています。
どうぞよろしくお願いいたします。
あなたの回答
tips
プレビュー