【问题标题】:How to check if specific column exists in an Access database table如何检查 Access 数据库表中是否存在特定列
【发布时间】:2016-02-23 19:27:30
【问题描述】:

我想知道如何检查Access 数据库的特定表(例如:myTable)中是否存在特定列(例如:日期)。

我读过this answer,它提供的查询会导致另一个查询。

IF NOT EXISTS(SELECT * 
              FROM sys.columns 
              WHERE [name] = N'columnName' 
                AND [object_id] = OBJECT_ID(N'tableName'))
BEGIN
    ALTER TABLE ADD COLUMN MYCOLUMN
END

但我需要的是true/false 结果。

更新 1

如何在我的 C# 应用程序中做到这一点?

也许使用SqlCommand.ExecuteScalar() 或别的什么?

【问题讨论】:

  • @marc_s 我使用ExecuteScalarExecuteNonQuery 得到Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'. 错误
  • 这是从 C# 确定 Access 中是否存在表的答案。也许它会为您指明比 SQL Server 代码更有用的方向:stackoverflow.com/a/4793675/121544
  • 是的,您在原始问题中没有提到这是针对 MS Access ........ SqlCommand 并且仅此 T-SQL 代码适用于 SQL Server .....

标签: c# sql database ms-access


【解决方案1】:

感谢所有提供解决方案的人,收集了一些答案,我想出了自己的解决方案版本。也许这不是最好的解决方案,但至少我不需要额外的 dll 来添加到引用或处理一些 stored procedures Access 不支持的问题。

OleDbConnection con = new OleDbConnection("my database address");
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT TOP 1 date FROM myTable";
con.Open();
bool exists = true;
try
{
  var x = cmd.ExecuteScalar();
}
catch (Exception e)
{
  exists = false;
}
con.Close();

【讨论】:

    【解决方案2】:

    正如 Andre451 在他的 answer 中提到的,您可以使用 Access DAO 来检查相关 TableDef 对象的 Fields 集合,如下所示:

    // test data
    string dbFileSpec = @"C:\Users\Public\Database1.accdb";
    string tblName = "Clients";
    string colName = "LastName";
    
    // COM reference required for project:
    // Microsoft Office 14.0 Access Database Engine Object Library
    //
    var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine();
    Microsoft.Office.Interop.Access.Dao.Database db = dbe.OpenDatabase(dbFileSpec);
    Microsoft.Office.Interop.Access.Dao.TableDef tbd = db.TableDefs[tblName];
    bool colExists = false;
    foreach (Microsoft.Office.Interop.Access.Dao.Field fld in tbd.Fields)
    {
        if (fld.Name.Equals(colName, StringComparison.InvariantCultureIgnoreCase))
        {
            colExists = true;
            break;
        }
    }
    db.Close();
    
    Console.WriteLine("Column " + (colExists ? "exists" : "does not exist"));
    

    【讨论】:

      【解决方案3】:

      在 Access VBA 中,您可以使用 TableDef.Fields 集合。不知道你是否可以在c#中使用这些对象。

      你为什么不干脆做(伪代码)

      columnExists = True
      try
          ExecuteSql "SELECT TOP 1 [Date] FROM myTable"
      catch
          // Error: column doesn't exist
          columnExists = False
      

      【讨论】:

      • 编程错误?为什么我觉得这不可接受
      • 如果替代方案是对所有字段进行循环(因为字段集合没有 .Exists 方法),我觉得它完全可以接受。
      【解决方案4】:

      试试这个:

      BEGIN
      
      IF NOT EXISTS(SELECT * FROM sys.columns 
              WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName'))
      SELECT 0
      ELSE
      SELECT 1 
      END
      

      在c#中使用:

      SqlCommand cmd = new SqlCommand();
      cmd.Connection = con;
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = "StoredProcedure3";
      con.Open();
      var x = cmd.ExecuteScalar();
      MessageBox.Show(x.ToString());
      con.Close();
      

      不使用存储过程:

      SqlCommand cmd = new SqlCommand();
      cmd.Connection = con;
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = "IF NOT EXISTS(SELECT * FROM sys.columns WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName')) SELECT 0 ELSE SELECT 1 ";
      con.Open();
      var x = (int)cmd.ExecuteScalar();
      MessageBox.Show(x.ToString());
      con.Close();
      

      【讨论】:

      • c#怎么办?
      • 我想用真正的查询替换StoredProcedure3吗?
      • @AlexJolig ... StoredProcedure3 是您的存储过程的名称。您可以将其更改为您的。
      • @marc_s...为什么不呢?它返回01
      • SQL Server 代码不会在 MS Access 数据库中运行。
      【解决方案5】:

      简单:

      select true
      

      完整代码:

      IF NOT EXISTS(SELECT * FROM sys.columns 
              WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName'))
          BEGIN
              select true
          END
      
      ELSE
      
          BEGIN
              select false
          END
      

      【讨论】:

      • c#怎么办?
      猜你喜欢
      • 2019-03-14
      • 2013-12-14
      • 2011-05-18
      • 2012-07-26
      • 2018-06-02
      • 1970-01-01
      • 2013-07-16
      • 2013-01-14
      • 2017-11-07
      相关资源
      最近更新 更多