0

我正在尝试使用ExecuteStoreQuery我的ObjectContext.

问题是我并不总是知道我正在查询的表中有多少列。理想情况下,我希望每个提取的行都只是一个string[]对象。

我在这里查看了示例 2:http: //msdn.microsoft.com/en-us/library/vstudio/dd487208 (v=vs.100).aspx

它接近我想要做的,除了我不知道TElement我正在获取的结构,所以我不能像他们在示例中那样定义一个结构。

下面是我的一些代码(由于 没有编译???? TElement)。下面的代码试图获取表信息,所以在这种情况下,我确实知道行的结构,但通常我不知道。

有没有办法做到这一点ExecuteStoreQuery?还是有不同的方法,同时仍然使用我的现有连接ObjectContext(而不是打开到数据库的新 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

我根据 Gert Arnold 的评论得到了这个工作。此外,我花了一些力气才发现我需要一个 SQLiteConnection,而不是我可以直接从 ObjectContext 获得的 EntityConnection。这个问题的答案帮助了我。

工作代码如下:

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 回答