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

西村和志 kazushin @ affrc.go.jp
2010年 7月 12日 (月) 19:30:15 EDT


皆様

お世話になります。

標記の件、結構、検証に手間がかかりそうですね・・・
時間を見つけて少しづつパターンを検証していこうと思います。

今回の作業_20100713_1
sqlite3(3.6.23.1)の最新版で下記データベース、テーブル、フィールド、レコードを作成

.\sqlite3.exe mydb_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; 

ExcelVBA/ADODBでデータの出力、入力、日本語の入力ができるか検証
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\test\mydb_sqlite3"
'mydb_sqlite3に接続
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
'検証1_以下3行はデータをExcelに書き出す→OK
    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
'検証2_以下2行は全てのレコードの"name"フィールドに"konarc"を入力する→OK
'    rs.Fields("name") = "konarc"
'    rs.Update
'検証3_以下2行は全てのレコードの"name"フィールドに"農研機構"を入力する→OK
'    rs.Fields("name") = "農研機構"
'    rs.Update    
    rs.MoveNext
    i = i + 1
Loop
'接続を閉じる
con.Close
Set con = Nothing
End Sub

結論:
SQLITE3(3.6.23.1)データベースは英名のデータベース、英名のテーブル、英名のフィールドであれば
ADODBで問題なくデータの入出力ができる。

というか、まずは和名データベース、和名テーブル、和名フィールドで検証するべきでしたね・・・
次回はこれで検証してみます。問題なければ「sqlite3」に関してはクリアになるので。

sqlite3のODBCドライバは以下より入手しています
http://www.ch-werner.de/sqliteodbc/





>西村様
>皆様
>
>嘉山です
>
>ご指定のODBCドライバをインストールしてファイルを操作してみましたが、西村様と同じようにデータの読み込みは
>できるのですが更新っしようとするとエラーが発生します。
>私の場合は単純にAccess2003でODBCを利用してspatialiteのファイルを開いてみたところです。
>
>spatialiteやSQLiteのODBCはバージョンの相性が問題であるようです。
>OSGeo4w のQuantumGIS 1.5  r13910 の ヘルプ->Quantum GISについて を開いてみると
>「SpatiaLiteのサポート付きでビルドされています(2.4.0)」とありますので、利用しているSpatiaLiteのバージョンが
>2.4.0であることがわかります。
>
>SpatialiteのWEBページをみてみると 2.4.0はまだ安定版ではないようですね。
>もしかするとスタンドアロン版のQGIS1.5の場合どのバージョンのSpatialiteを利用するかわかりませんから、
>スタンドアロン版ができたらインストールしてみてから、ここのバージョンをたしかめておくといいと思います。
>
>SQLite's latest version (3.6.16)というように最新版が利用されているようです。
>ここにあとは日本語コードが何を使っているかとかShiftJISなのかUTF-8なのかもからんでくるようですので、
>まずはSQLiteで日本語含みのDBの場合ODBCがどうすれば利用できるかを検証する必要があると思います。
>
>SQLiteで正しく動く条件がわかったら、それがspatialiteで動作するかどうかを検証できればいいと思います。
>
>なにかサンプルデータを決めて、いろいろな組み合わせを手分けして試行してみて、その結果をFAQに書いておけば
>spatialiteを利用する手順としていい情報共有になると思います。
>
>
>http://www.gaia-gis.it/spatialite-2.4.0/index.html
>日本語ははいっていませんが、まずはここのページの 	samples.tar.gz
>http://www.gaia-gis.it/spatialite-2.4.0/samples.tar.gz
>
>ここにあるデータベースの読み書きができるODBCとアプリケーションのくみあわせをさがすわけで、
>読み書きに失敗した情報なんかもほしいですね。
>
>というわけで、上記spatialiteファイルの読み書きができるプログラム、ドライバの組み合わせ情報がありましたら
>このMLにご報告いただけるとありがたいです->皆様
>また読み書きできない組み合わせの情報も同様にお願いします。
>
>私も時間みつけてちょくちょくいじってみます。
>
>
>2010年7月12日14:05 西村和志 <kazushin @ affrc.go.jp>:
>> 嘉山様
>> 皆様
>>
>> お世話になります。
>>
>> 下記にあるODBCドライバの内、SQLite3 ODBC Driverを使うと、ADODBでExcelにデータを書き出すことはできました。
>> http://www.ch-werner.de/sqliteodbc/
>> しかし、フィールドの値を更新するためにADODB.Recordestのupdateメソッドを実行しようとすると実行時エラーが生じます。
>> 下記はコード例です。
>> ////////////////////////////////////////////////////////////////////////////
>> 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\test1.sqlite"
>> 'sqliteに接続
>> con.Open
>> Set rs = New ADODB.Recordset
>> rs.Open "SELECT pkuid,地権者,面積 FROM test_Land;", con, adOpenStatic, adLockPessimistic, adCmdText
>> rs.MoveFirst
>> i = 1
>> Do Until rs.EOF = True
>> '以下3行はデータをExcelに書き出す。これは問題なく書き出す
>> '    Cells(i, 1).Value = rs.Fields("pkuid").Value
>> '    Cells(i, 2).Value = rs.Fields("地権者").Value
>> '    Cells(i, 3).Value = rs.Fields("面積").Value
>> '以下2行は全てのレコードの"地権者"フィールドに"農研機構"を入力する。が、updateで実行時エラー
>>    rs.Fields("地権者") = "農研機構"
>>    rs.Update
>>    rs.MoveNext
>>    i = i + 1
>> Loop
>> '接続を閉じる
>> con.Close
>> Set con = Nothing
>> End Sub
>> /////////////////////////////////////////////////
>> ちなみに
>> 「test1.sqlite」はspatialite-guiで作成し、そこにQGISver1.5でspatialite形式でレイヤ「test_Land」を作成しています。
>>
>> ADO.NET用のプロバイダとしては下記のものを見つけたので試してみました。
>> http://sourceforge.net/projects/sqlite-dotnet2/files/
>> VisualStudio2008のデータソース構成ウィザードでプロジェクトに上記プロバイダで
>> test1.sqliteに接続、フォームに「test_Land」をドラッグすると、データグリッドビューでデータを表示することはできます。
>> (接続の時に「ジオメトリ」フィールドは除外しておく。)
>> しかし、データグリッドビューのセル内で値を編集してから上書きしようとすると、やはりエラーになります。
>>
>> 結局、VBAのADO、visualstudioのADO.NETいずれも
>> 接続してデータを取得・表示できるけれど、編集はできない、という状況です。
>>
>> う〜ん、QGISのpythonプラグインの特訓をした方が速いような気がしてきました。
>>
>>
>>
>>
>>
>>>西村様
>>>皆様
>>>
>>>嘉山@OSGeo.jp です
>>>
>>>QGISで新規レイヤとしてspatialiteが利用できるようになったのはV1.5からです
>>>ので、まだこの機能を試した方は少ないと思います。
>>>そういう意味では、この機能の利用については現状では人柱的な位置になると思います。
>>>
>>>私もこのあたりの機能のGUIメッセージを確認するために先週の金曜日に初めてここの
>>>機能を使ったというのが現状でして、これから一緒に勉強させてくださいという段階です。
>>>
>>>spatialite自体はSQLiteの拡張で単一ファイルで空間データベースを構築できるので
>>>注目しております。
>>>
>>>とりあえずここでSQLiteの知識を仕入れてみました
>>>http://ja.wikipedia.org/wiki/SQLite
>>>
>>>データ型についてですが
>>>
>>>>データ型を指定する必要がない
>>>>サポートしている型は、Null/Integer/Real/Text/BLOBのみ
>>>>Unicodeのサポート
>>>>BLOBはメモリの許す限り
>>>>ROWIDを持っている (しかし、外部制約キーの仕組みがない)
>>>
>>>とのことです。Textとかは長さの指定が無いようです
>>>
>>>ODBCについては以下の記述があります
>>>
>>>>SQLiteのODBCドライバがサードパーティから提供されている。SQLite 2とSQLite 3のバージョンがあり、SQLite 2
>>>>向けには、さらにUTF-8対応版がある。Microsoft AccessからODBCリンクするときには、データ型をあらかじめ
>>>>SQLite側のCREATE TABLEで宣言しておく必要がある。そうしておかないと、全てのデータ型がintとみなされる
>>>>ことがある。日本語文字コードはUTF-8としておけば、Access側でも正しく表示される。
>>>
>>>ここらあたりについてちょいとためしてみてはいかがでしょうか。
>>>
>>>2010年7月11日9:33 西村和志 <netwaker @ msc.biglobe.ne.jp>:
>>>> お世話になります。
>>>>
>>>> 標記の件についてどなたかご教示いただけないでしょうか。
>>>>
>>>> QGISver1.5より編集可能になったspatialite形式についてです。
>>>>
>>>> SHP形式やArcGIS のmdb形式のレイヤはADOやADO.netで属性テーブルに接続して、
>>>> sqlクエリで値の入力・編集を行うことができますが、
>>>> spatialite 形式レイヤの属性値を同様の方法で編集することはできないでしょうか。
>>>> http://www.ch-werner.de/sqliteodbc/
>>>> に sqliteのODBCドライバがあるので、これで試してみたのですがうまくいきません。
>>>> ExcelVBAや.NETで作成したカスタムフォームで
>>>> 簡易にデータ入力を行うことができれば様々な業務システムのGISエンジンにQGISを
>>>> 採用することも考えられるので何とかしたいと考えています。
>>>> (QGISプラグインを作成できれば一番よいのですが、いかんせん、難しいです・・・。)
>>>>
>>>> それと、spatialiteでレイヤを作成し、フィールドを追加すると string型の文字数や数値型の桁数の指定が
>>>> 表示されません。これはspatialite形式の仕様でしょうか?
>>>>
>>>> よろしくお願いいたします。

////////////////////////////////////
一杯のカレーから日本農業が見えてくる
///////////////////////////////////



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