【问题标题】:Foxpro: Check whether table exists via vfpoledbFoxpro:通过 vfpoledb 检查表是否存在
【发布时间】:2010-08-04 21:15:47
【问题描述】:

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

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

【问题讨论】:

    标签: sql oledb foxpro visual-foxpro


    【解决方案1】:

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

    【讨论】:

    • 感谢有关 GetSchema() 的提示。
    【解决方案2】:

    此外,如果您要连接的 DBF 表是“免费”表,而不是实际连接的“数据库”(.dbc) 的一部分,那么您只需检查文件是否存在......例如在C#通过

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

    【讨论】:

      【解决方案3】:

      我不知道如何仅使用 SQL 来执行此操作,但也许您可以使用 File.Exists Method 检查磁盘上的文件是否存在,或者您可以编写一些代码来使用 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;
      }
      

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

      【讨论】:

      • 感谢。我现在做了类似的事情,但我想知道是否有一个 SQL 命令。
      猜你喜欢
      • 2014-06-24
      • 2017-02-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2015-03-07
      • 2011-01-17
      相关资源
      最近更新 更多