从数据库中获取表列表
Get list of tables from database
谁能告诉我如何从 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\"";
我认为使用 OleDbConnection.GetSchema() 是可行的方法。你这样做的方式,它只是 returns 你可用的元数据信息。您需要选择所需的元数据。您看到的信息是 'available restrictions' 和 'number of identifier parts' 的计数。要仅查看 table 的列表(以及 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"]);
}
}
谁能告诉我如何从 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\"";
我认为使用 OleDbConnection.GetSchema() 是可行的方法。你这样做的方式,它只是 returns 你可用的元数据信息。您需要选择所需的元数据。您看到的信息是 'available restrictions' 和 'number of identifier parts' 的计数。要仅查看 table 的列表(以及 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"]);
}
}