System.Data.OleDb
我通过(vfpoledb.dll)访问 .dbf 文件中的数据。如何通过 SQL 命令确定表是否存在?在 SQL Server 上类似于以下内容:
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
System.Data.OleDb
我通过(vfpoledb.dll)访问 .dbf 文件中的数据。如何通过 SQL 命令确定表是否存在?在 SQL Server 上类似于以下内容:
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
如果您有一个 dbc 文件,您可以查询它以查看该表是否存在。
string dbc = "northwind.dbc";
using (OleDbConnection conn = new OleDbConnection(connectionString)) {
DataTable dt = new DataTable();
string sql = string.Format(@"SELECT * FROM {0} WHERE ALLTRIM(ObjectType) = 'Table' AND UPPER(ALLTRIM(ObjectName)) = '{1}'", dbc, tableName.ToUpper());
OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);
da.Fill(dt);
bool tableExists = dt != null && dt.Rows.Count == 1;
}
但实际上,您不需要 sql 命令或 dbc 文件来获取该信息。您可以使用 GetSchema 方法直接从 OleDbConnection 获取它。
using (OleDbConnection conn = new OleDbConnection(connectionString)) {
conn.Open();
DataTable tables = conn.GetSchema("Tables");
conn.Close();
var tableExists = (from row in tables.AsEnumerable()
where row.Field<string>("Table_Name").Equals(tableName, StringComparison.CurrentCultureIgnoreCase)
select row.Field<string>("Table_Name")).FirstOrDefault() != null;
}
此外,如果您连接到“免费”表而不是实际连接的“数据库”(.dbc)的一部分的 DBF 表,那么您可以检查文件是否存在......例如在 C# 中通过
if( File.Exists( PathToTheDatabaseDirectory + TableYouExpect + ".DBF" ))
file is there
else
file is missing
我不知道如何仅使用 SQL 来执行此操作,但也许您可以使用File.Exists 方法检查磁盘上的文件是否存在,或者您可以编写一些代码来使用 OleDb 类检查 dbf 的存在:
private bool DbfExists(string dbfName, string connectionString)
{
bool dbfExists = true;
using(OleDbConnection conn = new OleDbConnection(connectionString))
{
string sql = string.Format("SELECT * FROM {0}", dbfName);
using(OleDbCommand command = new OleDbCommand(sql, conn))
{
OleDbDataReader reader = null;
try
{
conn.Open();
reader = command.ExecuteReader();
}
catch(Exception ex)
{
dbfExists = false;
}
finally
{
conn.Close();
reader = null;
}
}
}
return dbfExists;
}
我没有尝试编译此代码,因此可能需要对其进行一些调整。