0

ExecuteStoreQueryのメソッドを使用して、SQLiteデータベースに対して手動でSQLクエリを実行しようとしていますObjectContext

問題は、クエリを実行しているテーブルに列がいくつあるかを常に把握しているとは限らないことです。理想的には、フェッチされた各行を単にstring[]オブジェクトにしたいです。

ここで例2を見てきました:http://msdn.microsoft.com/en-us/library/vstudio/dd487208 (v = vs.100).aspx

フェッチしている構造がわからないことを除けば、やりたいことに近いTElementので、例のように構造体を定義することはできません。

以下は私のコードの一部です(のためにコンパイルされていません???? TElement)。以下のコードはテーブル情報を取得しようとしているので、この場合、行の構造はわかりますが、一般的にはわかりません。

これを行う方法はありExecuteStoreQueryますか?ObjectContextまたは、 (DBへの新しいSQL接続を開くのではなく)私の既存の接続を使用しながら、それを行う別の方法はありますか?

public void PrintColumnHeaders(NWRevalDatabaseEntities entities, string tableName)
{
    string columnListQuery = string.Format("PRAGMA table_info({0})", tableName);

    var result = entities.ExecuteStoreQuery<????>(columnListQuery);

    foreach (string[] row in result)
    {
        string columnHeader = row[1]; // Column header is in second column of table
        Console.WriteLine("Column Header: {0}", columnHeader);
    }
}
4

1 に答える 1

1

GertArnoldのコメントに基づいてこれを機能させました。また、ObjectContextから直接取得できるEntityConnectionではなく、SQLiteConnectionが必要であることを理解するのに少し手間がかかりました。この質問への答えは私を助けてくれました。

動作するコードは次のとおりです。

public static void PrintColumnHeaders(NWRevalDatabaseEntities entities, string tableName)
{
    var sc = ((System.Data.EntityClient.EntityConnection)entities.Connection).StoreConnection;
    System.Data.SQLite.SQLiteConnection sqliteConnection = (System.Data.SQLite.SQLiteConnection)sc;

    sqliteConnection.Open();
    System.Data.Common.DbCommand cmd = sc.CreateCommand();
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.CommandText = string.Format("PRAGMA table_info('{0}');", tableName);
    System.Data.Common.DbDataReader reader = cmd.ExecuteReader();

    if (reader.HasRows)
    {
        object[] values = new object[reader.FieldCount];
        while (reader.Read())
        {
            int result = reader.GetValues(values);
            string columnHeader = (string)values[1]; // table_info returns a row for each column, with the column header in the second column.
            Console.WriteLine("Column Header: {0}", columnHeader);
        }
    }
    sqliteConnection.Close();
} 
于 2013-03-02T11:19:59.810 に答える