C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Sqliteでデータの読込ができないことがある


(過去ログ 111 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65872 / inTopicNo.1)  Sqliteでデータの読込ができないことがある
  
□投稿者/ SEKA (1回)-(2013/03/21(Thu) 15:10:04)

分類:[.NET 全般] 

お世話になります。

Sqliteを使ってデータの読込をしたいのですが、読込ができない場合があって困っております。

【環境】
Visual Basic 2010 Express
言語:VB.net .NetFrameWork4.0
使用モジュール:System.Data.SQLite.dll(ファイルバージョン 1.0.84.0)

SQLiteDataReaderを使ってテーブルからデータを読込む処理をしているのですが、
フィールドの型がIntegerのデータをGetInt32で読み込む際に、「指定されたキャストは有効ではありません。」とエラーが出ます。
このエラーも必ず出るわけではなく、0を読もうとすると出ます。データが1以上であれば出ません。

ちなみにエラーがでるデータはGetStringで読むとエラーが出ずに読めます。(なのでデータは0ではなくNULLになっているような状態だと推測されます)

ただし、くどいようですがデータの型はIntegerです。
直接Sqliteの中身を見てみてもIntegerで0が入っています。

1以上のデータを読む時はGetStringで読み込むとエラーになるため、困っている状態です。

このような現象がでる原因に心当たりがある方は教えて頂けるとありがたいです。
申し訳ありませんが、よろしくお願いいたします。


引用返信 編集キー/
■65879 / inTopicNo.2)  Re[1]: Sqliteでデータの読込ができないことがある
□投稿者/ howling (255回)-(2013/03/21(Thu) 17:32:38)
No65872 (SEKA さん) に返信
うーん、コードがしっかり見えないので何とも言えないですが、
要はintでは示せない値ということですよね…。
初期状態の値であれば、DBNullの可能性があります。

よく値を参照する時に

if(hoge != NULL)

なんてのを入れることがあるかと思うのですが、

if(IsDBNull(hoge) == false) && (hoge != NULL))

というのがDBを使用する場合によく使われるかなと。
注意すべきは、NULLとDBNullは同一の物ではないこと。
これのelse側で0と入れてやればいいかと思うのですが…どうでしょう?

引用返信 編集キー/
■65880 / inTopicNo.3)  Re[1]: Sqliteでデータの読込ができないことがある
□投稿者/ とっちゃん (61回)-(2013/03/21(Thu) 17:55:18)
とっちゃん さんの Web サイト
No65872 (SEKA さん) に返信
> SQLiteDataReaderを使ってテーブルからデータを読込む処理をしているのですが、
> フィールドの型がIntegerのデータをGetInt32で読み込む際に、「指定されたキャストは有効ではありません。」とエラーが出ます。
> このエラーも必ず出るわけではなく、0を読もうとすると出ます。データが1以上であれば出ません。
>
> ちなみにエラーがでるデータはGetStringで読むとエラーが出ずに読めます。(なのでデータは0ではなくNULLになっているような状態だと推測されます)
>
テーブル作成時にそのフィールドにはNOT NULLの制約をつけていないことが原因と思われます。
そのあたりを確認してみてください。

ほかのDBは知りませんが、オリジナルの SQLite のデフォルトは、どの型でもNULLを許容です。
.NET ラッパーだからといってデフォルトNULLなしにはなっていないと思います。

引用返信 編集キー/
■65881 / inTopicNo.4)  Re[2]: Sqliteでデータの読込ができないことがある
□投稿者/ shu (236回)-(2013/03/21(Thu) 17:57:12)
No65879 (howling さん) に返信

ターゲットがVisual Basic 2010 Expressなので

> if(hoge != NULL)
>
> なんてのを入れることがあるかと思うのですが、
これはさっぱり分からない可能性があります。


> if(IsDBNull(hoge) == false) && (hoge != NULL))
if hoge is DBNull.Value Then
ここでNullの代わりの値を設定する
Endif

> これのelse側で0と入れてやればいいかと思うのですが…どうでしょう?
else側はNullではないので0を入れては駄目です。

引用返信 編集キー/
■65887 / inTopicNo.5)  Re[3]: Sqliteでデータの読込ができないことがある
□投稿者/ howling (256回)-(2013/03/21(Thu) 21:28:39)
No65881 (shu さん) に返信
そうですね、VBでしたね…。
ご説明ありがとうございました。
引用返信 編集キー/
■65928 / inTopicNo.6)  Re[2]: Sqliteでデータの読込ができないことがある
□投稿者/ SEKA (3回)-(2013/03/25(Mon) 10:17:15)
howling様、とっちゃん様、Shu様

ご返信遅くなりまして申し訳ありません。
レスいただきましてありがとうございました。

結論を先に申しますと、原因はとっちゃん様の仰られた
>テーブル作成時にそのフィールドにはNOT NULLの制約をつけていないことが原因と思われます。
>そのあたりを確認してみてください。
の部分でした。

PupSqliteというソフトで、ファイルのインポートではなく、そのまま既存のDBを開いただけだと
型がTEXTのNULLのデータも見た目はNULLと表示されていませんでした。(インポートするとNULLは(NULL)と表示される)
ですので、型がINTEGERのデータも見た目は0だけど、実際はNULLが入っていたということでした。

NOT NULLの制約を付けて、再度DBのインポートを行えば、正常に動作しました。
ちなみに制約を付けてからインポートしないとダメなようです。
後から制約を付けても既にインポートされたデータに関しては、制約は影響しませんでした。(当たり前か。。)

大変助かりました。皆様ありがとうございました。






解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -