[OSGeoJapan-discuss] spatialite形式レイヤの属性テーブルを ADOで接続・編集したい

西村和志 kazushin @ affrc.go.jp
2010年 7月 15日 (木) 00:01:46 EDT


皆様

お世話になります。

もはや私的メモと化したスレッドですが・・・
SQlite3データベースのExcel/ADO接続の試行です。

先に結論を
結論1:レコードに日本語が含まれている場合はsqlite3.exe、Excel/ADOの併用は難しい(互いの入力値が文字化ける)。
結論2:sqlite3はテーブル・フィールド作成、データ入出力を全てexcel/ADOで行うならexcel/ADOで和名テーブル、和名フィールド、日本語データを取り扱える。この場
合、sqlite3.exeではテーブル名、フィールド名が文字化けて表示され、かつselect文でテーブルを開くことができない(?)


以下が試行内容です。

まずはsqlite3.exeで英名テーブル、英名フィールドを作成、英語・日本語混じりでレコードを追加してみる
.\sqlite3.exe test100715.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 );
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; 

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
7|2009|西邑|1.1
8|2010|棚か|1.1
9|2011|粟飯原|1.1
10|2015|五島|1.1
11|2020|橘川|1.1
12|2025|尾化咲|1.1

特に問題は見当たらない

このテーブルをADOで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\test100715.sqlite3"
'sqliteに接続
con.Open
Set rs = New ADODB.Recordset
rs.Open "SELECT id,year,name,price 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("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

結果は

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
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
レコード7から12の名前が文字化け

続けてADOで全てのレコードのnameフィールドに"西村"を入力

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\test100715.sqlite3"
'sqliteに接続
con.Open
Set rs = New ADODB.Recordset
rs.Open "SELECT id,year,name,price FROM testtable1;", con, adOpenStatic, adLockPessimistic, adCmdText
rs.MoveFirst
i = 1
Do Until rs.EOF = True
'以下2行は全てのレコードの"name"フィールドに"西村"を入力する→ステップインで実行したところ、レコード7のupdateでエラーになる
    rs.Fields("name") = "西村"
    rs.Update
    rs.MoveNext
    i = i + 1
Loop
'接続を閉じる
con.Close
Set con = Nothing
End Sub

ステップインで実行したところ、レコード7のupdateでエラーになる
続けてExcelシートにテーブルを出力してみると

1	2009	西村	1.1
2	2010	西村	1.1
3	2011	西村	1.1
4	2015	西村	1.1
5	2020	西村	1.1
6	2025	西村	1.1
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

レコード1から6のnameフィールドには"西村"が入力されているが、レコード7以下は以前のまま。
このテーブルを今度はsqlite3.exeのselect文で表示してみる。

.\sqlite3.exe test100715.sqlite3
select * from testtable1;

結果は

1|2009|隘ソ譚掃1.1
2|2010|隘ソ譚掃1.1
3|2011|隘ソ譚掃1.1
4|2015|隘ソ譚掃1.1
5|2020|隘ソ譚掃1.1
6|2025|隘ソ譚掃1.1
7|2009|西邑|1.1
8|2010|棚か|1.1
9|2011|粟飯原|1.1
10|2015|五島|1.1
11|2020|橘川|1.1
12|2025|尾化咲|1.1

Excelに正しく出力されていたレコード1から6は文字化け、
Excelで文字化けし、updateに失敗したレコード7から12は(最初の入力値のまま)正しく表示。

結論1:レコードに日本語が含まれている場合はsqlite3.exe、Excel/ADOの併用は難しい。互いに文字化ける。
対策?:sqlite3テーブルをExcel/ADOで読み書きする場合はVBAコード内で文字コードの変換を行う必要がある?

おまけ
Excel/ADOでtest100715.sqlite3に和名テーブル、和名フィールド、日本語レコードを追加するとどうなるか
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\test100715.sqlite3"
'sqliteに接続
con.Open
con.Execute "CREATE TABLE 日本語テーブル (番号, 名前, 価格);"
con.Execute "INSERT INTO 日本語テーブル VALUES(3, '西村', 55.1);"
con.Execute "INSERT INTO 日本語テーブル VALUES(4, '九州', 88);"
con.Execute "INSERT INTO 日本語テーブル VALUES(5, '北海道', 55.11111);"
con.Execute "INSERT INTO 日本語テーブル VALUES(6, '東北', 55.1222);"
con.Execute "INSERT INTO 日本語テーブル VALUES(7, '関東', 55.12);"
con.Execute "INSERT INTO 日本語テーブル VALUES(8, '中国', 5.1);"
con.Close
Set con = Nothing
End Sub

特にエラーは起きない

作成したテーブルをExcelに出力してみる

Sub test2()
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\test100715.sqlite3"
'sqliteに接続
con.Open
Set rs = New ADODB.Recordset
rs.Open "SELECT 番号,名前,価格 FROM 日本語テーブル;", con, adOpenStatic, adLockPessimistic, adCmdText
rs.MoveFirst
i = 1
Do Until rs.EOF = True
'以下3行はデータをExcelに書き出す
    Cells(i, 1).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
End Sub

結果

3		西村	55.1
4		九州	88
5		北海道	55.11111
6		東北	55.1222
7		関東	55.12
8		中国	5.1

文字化けることなくexcelに出力表示される。

このテーブルがsqlit3.exeでどのように認識されているか、というと

.\sqlite3.exe test100715.sqlite3
select * from sqlite_master;

結果は

table|譌・譛ャ隱槭ユ繝シ繝悶Ν|譌・譛ャ隱槭ユ繝シ繝悶Ν|6|CREATE TABLE 譌・譛ャ隱槭ユ繝シ
繝悶Ν (逡ェ蜿キ, 蜷榊燕, 萓。譬シ)

テーブル名、フィールド名が文字化ける・・・

結論2:sqlite3はテーブル・フィールド作成、データ入出力を全てexcel/ADOで行うならexcel/ADOで和名テーブル、和名フィールド、日本語データを取り扱える。この場
合、sqlite3.exeではテーブル名、フィールド名が文字化けて表示され、かつselect文でテーブルを開くことができない(?)

////////////////////////////////////
全ての農作物には何かしら効能がある。
結局、バランスの良い食事に勝るものはない。
///////////////////////////////////



OSGeoJapan-discuss メーリングリストの案内