Foxpro:通过vfpoledb检查表是否存在

时间:2010-08-04 21:15:47

标签: sql oledb foxpro visual-foxpro

我通过System.Data.OleDb(vfpoledb.dll)访问.dbf文件中的数据。如何通过SQL命令查明表是否存在?类似于SQL服务器上的以下内容:

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

3 个答案:

答案 0 :(得分:3)

如果你有一个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;
}

答案 1 :(得分:1)

此外,如果您连接到“FREE”表并且实际上不是连接的“数据库”(.dbc)的DBF表,那么您可以检查文件是否存在...例如C#via

if( File.Exists( PathToTheDatabaseDirectory + TableYouExpect + ".DBF" ))
   file is there
else
   file is missing

答案 2 :(得分:0)

我不知道如何仅使用SQL来执行此操作但是您可以使用File.Exists Method检查磁盘上是否存在该文件,或者您可以编写一些代码来检查是否存在使用的dbf OleDb课程:

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;
}

我还没有尝试编译这段代码,所以可能需要稍微调整一下。