[OSGeoJapan-discuss] spatialite形式レイヤの属性テーブルを ADOで接続・編集したい
西村和志
kazushin @ affrc.go.jp
2010年 7月 13日 (火) 23:12:11 EDT
皆様
お世話になります。
標記の件から派生してsqlite3のDBをodbc経由でADO接続できるかチェックしていたのですが、
ちょっとカオスな感じになっています。
ご興味のない方々は読み飛ばすよう、お願いします。
先に結論だけ
1.sqlite3.exeで和名データベースを作成すると、データベース名が文字化けする
2.sqlite3.exeで和名フィールド、和名レコードを作成するとsqlite3.exe内では正常に表示されるが、ExcelVBAでADO接続するとレコードセットがオープンできない、英
名フィールドに和名レコードが入っている場合はレコードセットがオープンできてもレコードの和名部分は(excel表示で)文字化ける。
3.sqlite3.exeの文字コードが原因?
本日の作業20100714
1.日本語のデータベースを作成、英名フィールド、英字レコードの挿入
.\sqlite3.exe テストdb.sqlite3
CREATE TABLE testtable1 (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
year INTEGER ,
name TEXT ,
price REAL);
BEGIN TRANSACTION;
INSERT INTO testtable1 VALUES(1, 2009, 'nishimura', 1.1 );
INSERT INTO testtable1 VALUES(2, 2010, 'tanaka', 1.1 );
INSERT INTO testtable1 VALUES(3, 2011, 'aihara', 1.1 );
INSERT INTO testtable1 VALUES(4, 2015, 'gotou', 1.1 );
INSERT INTO testtable1 VALUES(5, 2020, 'kikkawa', 1.1 );
INSERT INTO testtable1 VALUES(6, 2025, 'okazaki', 1.1 );
COMMIT;
結果
・テストdb.sqlite3の「テスト」部分が化けて「eXgdb.sqlite3」というファイルができる。これに接続してみると
.\sqlite3.exe eXgdb.sqlite3
select * from testtable1;
1|2009|nishimura|1.1
2|2010|tanaka|1.1
3|2011|aihara|1.1
4|2015|gotou|1.1
5|2020|kikkawa|1.1
6|2025|okazaki|1.1
データベース名は化けるが、テーブル、レコードは生成されている。
でも、ちょっと気になる。
2.英名データベースを作成、和名フィールド、英字レコードの挿入
.\sqlite3.exe testdb.sqlite3
CREATE TABLE testtable1 (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
西暦 INTEGER ,
名前 TEXT ,
価格 REAL);
BEGIN TRANSACTION;
INSERT INTO testtable1 VALUES(1, 2009, 'nishimura', 1.1 );
INSERT INTO testtable1 VALUES(2, 2010, 'tanaka', 1.1 );
INSERT INTO testtable1 VALUES(3, 2011, 'aihara', 1.1 );
INSERT INTO testtable1 VALUES(4, 2015, 'gotou', 1.1 );
INSERT INTO testtable1 VALUES(5, 2020, 'kikkawa', 1.1 );
INSERT INTO testtable1 VALUES(6, 2025, 'okazaki', 1.1 );
COMMIT;
フィールド名が文字化けていないかチェック
select * from sqlite_master;
table|testtable1|testtable1|2|CREATE TABLE testtable1 (id INTEGER PRIMARY KEY A
UTOINCREMENT NOT NULL,
西暦 INTEGER ,
名前 TEXT ,
価格 REAL)
大丈夫そう
レコードをチェック
select * from testtable1;
1|2009|nishimura|1.1
2|2010|tanaka|1.1
3|2011|aihara|1.1
4|2015|gotou|1.1
5|2020|kikkawa|1.1
6|2025|okazaki|1.1
大丈夫
日本語混じりのレコードを挿入してみる
BEGIN TRANSACTION;
INSERT INTO testtable1 VALUES(7, 2009, '西邑', 1.1 );
INSERT INTO testtable1 VALUES(8, 2010, '棚か', 1.1 );
INSERT INTO testtable1 VALUES(9, 2011, '粟飯原', 1.1 );
INSERT INTO testtable1 VALUES(10, 2015, '五島', 1.1 );
INSERT INTO testtable1 VALUES(11, 2020, '橘川', 1.1 );
INSERT INTO testtable1 VALUES(12, 2025, '尾化咲', 1.1 );
COMMIT;
問題なし
次に、ADODBでtestdb.sqlite3のtesttable1に接続してみる。
(結果、エラーになる。詳細は下記コード)
Sub test()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
'Connection生成と接続文字列の設定
Set con = New ADODB.Connection
con.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=F:\gisdata\spatialite\sqlite3\testdb.sqlite3"
'sqliteに接続
con.Open
Set rs = New ADODB.Recordset
'この直下のrs.openでエラーになる
rs.Open "SELECT id,西暦,名前,価格 FROM testtable1;", con, adOpenStatic, adLockPessimistic, adCmdText
rs.MoveFirst
i = 1
Do Until rs.EOF = True
'以下3行はデータをExcelに書き出す
Cells(i, 1).Value = rs.Fields("id").Value
Cells(i, 2).Value = rs.Fields("西暦").Value
Cells(i, 3).Value = rs.Fields("名前").Value
Cells(i, 4).Value = rs.Fields("価格").Value
rs.MoveNext
i = i + 1
Loop
'接続を閉じる
con.Close
Set con = Nothing
testdb.sqlite3に英名フィールド、和名レコードを挿入してみる
CREATE TABLE testtable2 (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
year INTEGER ,
name TEXT ,
price REAL);
BEGIN TRANSACTION;
INSERT INTO testtable2 VALUES(7, 2009, '西邑', 1.1 );
INSERT INTO testtable2 VALUES(8, 2010, '棚か', 1.1 );
INSERT INTO testtable2 VALUES(9, 2011, '粟飯原', 1.1 );
INSERT INTO testtable2 VALUES(10, 2015, '五島', 1.1 );
INSERT INTO testtable2 VALUES(11, 2020, '橘川', 1.1 );
INSERT INTO testtable2 VALUES(12, 2025, '尾化咲', 1.1 );
COMMIT;
ADODBでtesttable2を取得、excelに表示してみる
Sub test()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
'Connection生成と接続文字列の設定
Set con = New ADODB.Connection
con.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=F:\gisdata\spatialite\sqlite3\testdb.sqlite3"
'sqliteに接続
con.Open
Set rs = New ADODB.Recordset
rs.Open "SELECT id,year,name,price FROM testtable2;", con, adOpenStatic, adLockPessimistic, adCmdText
rs.MoveFirst
i = 1
Do Until rs.EOF = True
'以下3行はデータをExcelに書き出す
Cells(i, 1).Value = rs.Fields("id").Value
Cells(i, 2).Value = rs.Fields("year").Value
Cells(i, 3).Value = rs.Fields("name").Value
Cells(i, 4).Value = rs.Fields("price").Value
rs.MoveNext
i = i + 1
Loop
'接続を閉じる
con.Close
Set con = Nothing
End Sub
結果は下記の通り
7 2009 W 1.1
8 2010 I 1.1
9 2011 ь 1.1
10 2015 ? 1.1
11 2020 ki 1.1
12 2025 c 1.1
nameフィールドに入力した和名データが文字化け・・・
でもsqlite3.exeでselect文で確認すると正常に表示される・・・
本日の結論
1.sqlite3.exeで和名データベースを作成すると、データベース名が文字化けする
2.sqlite3.exeで和名フィールド、和名レコードを作成するとsqlite3.exe内では正常に表示されるが、ExcelVBAでADO接続するとレコードセットがオープンできない、英
名フィールドに和名レコードが入っている場合はレコードセットがオープンできてもレコードの和名部分は文字化ける。
3.sqlite3.exeの文字コードが原因?
では、ADODBでsqlite3のデータベースに和名フィールドや和名レコードを挿入するとどうなるのだらうか?
挿入できた場合、sqlite3.exeのselect文で正常に表示されるのだろうか?
なかなかspatialiteにたどりつきません・・・
////////////////////////////////////
旬のものを食べよう!
それが食料自給率向上への近道!
///////////////////////////////////
OSGeoJapan-discuss メーリングリストの案内