2023/10/11

System.Data.SQLite.Core Ver1.0.118での新規DB作成

 先日インストーラーが作れるようになったのでリリースモデルをビルドしてテスト用の仮想マシンにインストールしてテストを始めてます。まあ、新規にアプリをインストールして起動すれば当然ながらSQLiteのデータベースファイルを作成する様にしてあるんですが、これまで特に問題が無いと思っていましたが、まさかのデータベースの新規作成で躓きました。

ただ、グーグル先生もアイビー先生もエラーの情報は無い感じ。まあ、自分でググって諸々見ても簡単な成功例ばかりです。確かにデバッグビルドでは問題なかったと思うので皆さんリリースモデルでは既にデータベースファイルは作成されているので、リリースモデルでの新規作成をしてないのか? それとも自分が何か間違えてるのか判断出来ません。

SQLiteConnection.CreateFile(UserData.UserDataFName);
SQLiteConnectionStringBuilder sqlBuilder = new SQLiteConnectionStringBuilder()
{
    DataSource = UserData.UserDataFName
};
using (SQLiteConnection con = new SQLiteConnection(sqlBuilder.ConnectionString))
{
    con.Open();
    using (SQLiteCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = UserData.USER_MARK_CREATE_TEXT;
        iReturnCode = cmd.ExecuteNonQuery();
    }
    con.Close();
}

こんな感じで新規作成してテーブルも作ったりしてるんですが、SQLiteConnectionのコンストラクター辺りで与えたパスに多分起動パスか何かをCombineしてる所でnullがって感じのエラーになるのですが、当然こちらは単純に"UserData.db"的なファイル名を与えてるのでnullではないです。試しにファイル名ではなくフルパスにしてみたりもしましたがNG。実はユーザー用と検証用のデータベースファイルを初回起動時にまあ同じ感じのコーディングで新規作成してるんですが、先のユーザー用ではエラーになり、2番目の検証用の新規作成ではエラーになりません。どこが違うのか間違い探ししてみましたがありませんでした。で、更にその後にJV-Linkからのデータ収納するデータベースも新規作成するのですがこれもやはり同じエラーが出るんです。デバックビルドでは何度もデータベースの新規作成はしてるのでコード的には問題ないと思うんです。苦肉の策で

try
{
    SQLiteConnection.CreateFile(UserData.UserDataFName);
    SQLiteConnectionStringBuilder sqlBuilder = new SQLiteConnectionStringBuilder()
    {
        DataSource = UserData.UserDataFName
    };
    using (SQLiteConnection con = new SQLiteConnection(sqlBuilder.ConnectionString))
    {
        con.Open();
        using (SQLiteCommand cmd = con.CreateCommand())
        {
            cmd.CommandText = UserData.USER_MARK_CREATE_TEXT;
            iReturnCode = cmd.ExecuteNonQuery();
        }
        con.Close();
    }
}
catch (Exception ex)
{
    try
    {
        SQLiteConnection.CreateFile(UserData.UserDataFName);
        SQLiteConnectionStringBuilder sqlBuilder = new SQLiteConnectionStringBuilder()
        {
            DataSource = UserData.UserDataFName
        };
        using (SQLiteConnection con = new SQLiteConnection(sqlBuilder.ConnectionString))
        {
            con.Open();
            using (SQLiteCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = UserData.USER_MARK_CREATE_TEXT;
                iReturnCode = cmd.ExecuteNonQuery();
            }
            con.Close();
        }
    }
    catch (Exception ex2)
    {
        Debug.WriteLine(ex2.ToString());
    }
}

とすれば動いてくれます。ちょっとこの無駄なリトライコーディングをリリースビルドに入れるのは忍びないのですが、バージョンアップで修正される事を期待したいです。英語でまた報告しなきゃ改善されないかもなので報告はしようかとは思うんですが...

追記 2023/10/12
色々と調べてますが、一概にSystem.Data.SQLite.CoreのバグというよりはVisual Studio Community 2022のC#での発行時の実行形式生成時に何かしら原因があるのかもです。少なくともVisual Studio上でリリースビルドをデバッグ無しで実行するとエラー無く実行出来るのに発行してインストーラー作成してインストールしたものを実行するとエラーが発生します。リリースビルド時にはまだ.exeと.dllに分かれてたりしますが、発行すると.exeに纏められます。
予感的中!発行時のオプションに「すべての設定を表示」とあるんですが開くとプロファイル設定ダイアログが表示され「ファイルの公開オプション」を展開すると「単一ファイルの作成」というオプションが有り、これを選択しないと無数のフォルダを含めかなりの量のファイルが出来てしまい面倒に感じます。なので当たり前の様に選択する事で極力減らしてましたが、試しにこのオプション外して発行してインストーラー作成してみとるエラーが出ません。やれやれ、またMicrosoftに報告して修正してもらわなきゃです。昨日だったかVisual Studioがバージョンアップされてましたが...

0 件のコメント:

コメントを投稿