我正在尝试使用ExecuteStoreQuery
上的ObjectContext
方法对我的SQLite数据库进行一些手动SQL查询。
问题是,我并不总是知道我正在查询的表中有多少列。理想情况下,我希望每个获取的行只是一个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);
}
}
答案 0 :(得分:1)
我根据Gert Arnold的评论得到了这个。另外,我花了一些力气才弄清楚我需要一个SQLiteConnection,而不是我可以直接从ObjectContext获取的EntityConnection。 this问题的答案帮助了我。
工作代码如下:
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();
}