【问题标题】:Get list of tables from database从数据库中获取表列表
【发布时间】:2017-02-02 21:14:04
【问题描述】:

谁能告诉我如何从 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();

    }
}

编辑:

根据 Tamar 的建议,将查询语句更改为...

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

【问题讨论】:

  • 您当然可以在查询中添加 WHERE 子句:WHERE objecttype="Table"
  • @TamarE.Granor 好收获!我会补充的。
  • 然后呢?这解决了你的问题吗?如果是这样,请将其发布为答案。
  • @JeroenMostert 确实如此,但 Cetin 想出了一个更好的解决方案,所以我将他标记为正确答案。

标签: c# oledb visual-foxpro


【解决方案1】:

我认为使用 OleDbConnection.GetSchema() 是可行的方法。你这样做的方式,它只是返回你可用的元数据信息。您需要选择所需的元数据。您看到的信息是“可用限制”和“标识符部分数量”的计数。要仅查看表列表(带有 Table_type -view 或 table-、描述、修改和创建日期等附加信息),您需要将“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"]);
    }
}

【讨论】:

  • 太棒了...我不知道我是怎么错过GetSchema 可以传递参数的。您的代码返回与我的代码完全相同的结果,这是正确的方法。谢谢。
  • 如何检查其用户定义的表
  • @transformer,在 VFP 中所有表都是用户定义的。如果您的意思是表格、类库、菜单……它们实际上并没有包含在数据库中,或者即使它们包含在数据库中,您也可以从它们的扩展中推断它们。除此之外,您可以检查它们的内容,否则没有什么特定于“用户定义的表”(即使那些可能是纯用户定义的表)。
猜你喜欢
  • 2013-10-16
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2011-09-21
相关资源
最近更新 更多