質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

1回答

679閲覧

SQLiteへDouble.MinValueを格納すると-∞になる場合がある

HOTSLIME

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2020/06/30 11:10

前提・実現したいこと

C#のプログラムでSQLiteのREAL型のカラムへDouble.MinValueをそのまま保存&取得したいです。

発生している問題

C#でINSERTした場合、PupSQLite等で確認すると-∞として格納されていることがあります。

該当のソースコード

C#

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 CreateDB(); 6 } 7 8 static void CreateDB() 9 { 10 var dbFilePath = Environment.CurrentDirectory + "\test.sqlite"; 11 if(File.Exists(dbFilePath)) 12 { 13 try 14 { 15 using (var con = new SqliteConnection($@"Data Source={dbFilePath}")) 16 { 17 con.Open(); 18 con.Execute($@" 19INSERT INTO user (id, name, value1) SELECT 1 , 'user1', @value1 ; 20INSERT INTO user (id, name, value1) SELECT 2 , 'user2', {Double.MinValue}; 21INSERT INTO user (id, name, value1) SELECT 3 , 'user3', -1.7976931348623157E+308 ; 22" , param: new{ value1 = Double.MinValue }); 23 } 24 } 25 catch (Exception e) 26 { 27 Console.WriteLine(e); 28 throw; 29 } 30 } 31 } 32 }

試したこと

VisualStudio2019で.NET Core3.1のプロジェクトとして作成しソースコードの内容を実行しました。

PupSQLiteでテーブルを確認した際は以下の結果が格納されていました。

id(INTEGER)name(TEXT)value1(REAL)
1user1-1.7976931348623157E+308
2user2-∞
3user3-∞

補足情報(FW/ツールのバージョンなど)

Nuget

名称バージョン
Dapperv2.0.35
Microsoft.Data.SQLitev3.1.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

SQLite は触ったこともないのでハズレの回答だったらすみません。

書かれているコードを見ると、パラメータ化の有無(1 番最初だけがパラメータ化クエリ)の違いが結果に表れているように思えます。

ただ、見た感じではパラメータ化してない 2 番目、3 番目でもよさそうで、なぜ結果に違いが出るのかは分かりませんが。(強いて言うと、2 番目、3 番目は double.MinValue がクエリに文字列として埋め込まれていてそこが SQLite でどう解釈されるのか怪しい感じがします。1 番目は double.MinValue の値が生でパラメータに渡されていて間違う余地がなさそうだと思います)

SQL Server ではパラメータ化クエリは sp_executesql に変換されて実行されます。SQLite でもそのような違いがあって、それが結果の違いになっているのかも。(想像です。でも、結果からは、1 番目のパラメータ化クエリと 2, 3 番目のアドホッククエリとでは何か内部での扱いが違うのは間違いなさそうに見えます)

ちなみに、本題とは直接関係ない話ですが、SQL Server では、SQL インジェクションの防止とパフォーマンスの向上、それに副次的な効用として文字化けを未然に防ぐということで、パラメータ化クエリを使うのは必須と言ってもいいです。

SQLite でも同じようにな話になるのではないでしょうか?

投稿2020/07/01 01:14

編集2020/07/01 01:33
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問