2017-02-02 153 views
2

任何人都可以告诉我如何从C#中获取Visual FoxPro数据库中的表的列表?从数据库获取表的列表

我试过使用GetSchema,但返回的信息似乎只是计数(而不是准确的计数)。

这是我有...

string connSrc = @"Provider=VFPOLEDB.1;Data Source=myvfpdb.dbc"; 
using (var cmdSrc = new OleDbCommand()) 
using (var dbconnSrc = new OleDbConnection(connSrc)) 
{ 
    dbconnSrc.Open(); 
    DataTable schema = dbconnSrc.GetSchema(); 
} 

我想可能有一些方法,我可以直接打开DBC文件并对其运行一个SELECT但问题是数据库所在的路径到连接字符串。我找不到可以提取架构信息的OleDb命令。

编辑

我发现,工作的方式,但它似乎有点笨重。任何人都知道更好的方法?

string connSrc = @"Provider=VFPOLEDB.1;Data Source=myvfpdb.dbc"; 
using (var conn = new OleDbConnection(connSrc)) 
    dbc = conn.DataSource; 

string path = Path.GetDirectoryName(dbc); 
string database = Path.GetFileName(dbc); 

using (var conn = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + path)) 
{ 
    conn.Open(); 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT * FROM " + database; 
     DbDataReader reader = cmd.ExecuteReader(); 

    } 
} 

编辑:

随着添马舰的建议改变了查询语句这个...

cmd.CommandText = $"SELECT ObjectName FROM {database} WHERE ObjectType = \"Table\""; 
+1

可以肯定WHERE子句添加到查询:WHERE OBJECTTYPE = “表” –

+0

@ TamarE.Granor良好的渔获!我会补充一点。 –

+0

而且?这是否解决了你的问题?如果确实如此,请将其作为答案发布。 –

回答

3

我认为使用OleDbConnection.GetSchema()是要走的路。你这样做,它只是返回你可用的元数据信息。你需要选择你想要的元数据。您看到的信息是“可用限制”和“标识符部分数量”的计数。要仅查看表的列表(以及其他信息,如Table_type - 查看或表格,描述,修改和创建日期),您需要将'Tables'作为参数传递给GetSchema。即:

void Main() 
{ 
    string strCon = 
      @"Provider=vfpoledb;Data Source=C:\PROGRAM FILES (x86)\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data\testdata.dbc"; 
    DataTable tableInfo; 
    using (OleDbConnection con = new OleDbConnection(strCon)) 
    { 
     con.Open(); 
     tableInfo = con.GetSchema("Tables"); 

     // or get TABLES only 
     // tableInfo = con.GetSchema("Tables", new string[] {null,null,null,"TABLE"}); 

     con.Close(); 
    } 
    foreach (DataRow row in tableInfo.Rows) 
    { 
     Console.WriteLine(@"Name:[{0}] Type:[{1}]", 
      row["TABLE_NAME"], 
      row["TABLE_TYPE"]); 
    } 
} 
+0

太棒了......我不知道我错过了什么'GetSchema'可以传递一个参数。你的代码返回与我的代码完全相同的结果,这是**正确**的方式来做到这一点。谢谢。 –