30525


Javaで書かれたSQLiteプログラムをC#に変換する必要があるのですが  
業務上、DBプログラムは分野外で知識がなく、手が出せません。

JavaのAPI仕様書を見てもDBの知識がなく、さっぱり理解できず、  
変換コードを教えていただけると助かります。  
(単純な質問でお恥ずかしい限りですが、工数的制約で...)

具体的には以下のコードで(いろいろ端折ってますが)、  
DBプログラム以外の所は素直にC#変換にしました。  
C#での利用ライブラリはSystem.Data.SQLiteです(Javaは不明...)

[code]

    Connection con = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
    PersistenceManager manager = new PersistenceManager();
    IDaos daos = manager.createDaos(con);
    
    String sql = "from moduleList where 1 = 1 ";
    sql += "and module_name like ? ";
    var statement = daos.getConnection().prepareStatement("select count(*) " + sql);
    
    var params = new List<String>();
    params.Add(moduleName + "%");
    
    for (int i = 0; i < params.Count; i++)
        statement.setString(i + 1, params[i]);
    params.Add(limit.ToString());
    params.Add(offset.ToString());
    
    List<Module> list = daos.getObjectDao().readList(typeof(Module), "select * " + sql + " limit ? offset ?", params.ToArray());
    
[/code]

ざっと調べた限り、Connection/PersistenceManager/IDaosに相当するクラスはC#にはなさそうなのですが(相当するクラスがあってもメソッドを変換できる気がしないのですが...)


CC BY-SA 3.0
2016-11-19T01:20:33.967
30521
2016-11-20T04:17:42.917
2016-11-19T02:12:32.147
5519
19118
question
java c# sqlite
JavaのSQLiteプログラムをC#に変換


まず接続には`DbConnection`派生型を使用します。今回はSQLiteのため`SQLiteConnection`をインスタンス化します。当然接続に使用する接続文字列はJDBCとは異なりますのでご注意ください。

[code]

    // (仮) string dbPath = null, moduleName = null;
    // int limit = 0, offset = 0;
    
    //Connection con = DriverManager.getConnection("jdbc:sqlite:" + dbPath);
    using (var con = new SQLiteConnection("Data Source=" + dbPath))
    {
    
[/code]

接続/トランザクションの管理方法は要件やコンテナに合わせて実装しなければなりませんが、今回は既定のコネクションプールを使用します。このため下の二行は単純に無視しています。

[code]

        // PersistenceManager manager = new PersistenceManager();
        // IDaos daos = manager.createDaos(con);
    
        String sql = "from moduleList where 1 = 1 ";
        sql += "and module_name like ? ";
    
[/code]

`Statement`に相当するのは`DbCommand`です。コンストラクターや`DbConnection`のメソッドで作成することが出来ます。

[code]

        // var statement = daos.getConnection().prepareStatement("select count(*) " + sql);
        var statement = con.CreateCommand();
        statement.CommandText = "select count(*) " + sql;
    
[/code]

パラメーターはコマンドの`Parameters`プロパティに設定します。

[code]

        // var params = new List<String>();
        // params.Add(moduleName + "%");
        // for (int i = 0; i < params.Count; i++)
        // statement.setString(i + 1, params[i]);
        statement.Parameters.AddWithValue("?", moduleName + "%");
    
[/code]

SQL文とパラメーターをコマンドに設定したあと、目的に応じて`ExecuteReader`/`ExecuteScalar`/`ExecuteNonQuery`メソッドを実行します。`statement`の場合は単一の値を返すSQLが設定されているので、`ExecuteScalar`を使用してください。

[code]

         // object count = statement.ExecuteScalar();
         // Convert.ToInt32(count)などで目的の型に変換する
    
[/code]

複数行を返すSQLは`ExecuteReader`で`DbDataReader`を取得してフェッチします。なおエンティティへの直接変換にはより高度な`Entity
Framework`などを使用しますが、大幅な改設計が必要になりますので下記では一行ずつ読み取る方法を使用しています。

[code]

        //params.Add(limit.ToString());
        //params.Add(offset.ToString());
        // List<Module> list = daos.getObjectDao().readList(typeof(Module), "select * " + sql + " limit ? offset ?", params.ToArray());
        List<Module> list = new List<Module>();
        statement.CommandText = "select * " + sql + " limit ? offset ?";
        statement.Parameters.AddWithValue("?", limit);
        statement.Parameters.AddWithValue("?", offset);
    
        using (var reader = statement.ExecuteReader())
        {
            while (reader.Read())
            {
                list.Add(new Module()
                {
                    // Name = (string)reader["module_name"]などを代入
                });
            }
        }
    }
    
[/code]

なお上記のソースはJavaのコードを逐語的にC#へ置き換えるために`DbCommand`を使用していますが、特殊なSQLを使用していないのであればEntity
Frameworkの導入をお勧めします。


CC BY-SA 3.0
2016-11-19T04:17:21.970
30525
2016-11-20T04:17:42.917
2016-11-20T04:17:42.917
5750
5750
30521
answer