【问题标题】:How to know if a table exists in an Access Database in an OleDb connection如何知道表是否存在于 OleDb 连接中的 Access 数据库中
【发布时间】:2014-12-09 15:45:35
【问题描述】:

我正在使用下面的代码通过C# .Net 中的OleDb 连接连接到Access 数据库

如何知道我硬编码到程序中的表是否确实存在于文件中,以便向用户显示相应的消息?

try
{
    var dbSource = "Data Source = " + source;
    const string dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;";

    using (var con = new OleDbConnection())
    {
        con.ConnectionString = dbProvider + dbSource;
        con.Open();

        using (var cmd = new OleDbCommand())
        {
            cmd.Connection = con;
            cmd.CommandText = "SELECT * FROM [Concrete Design Table 1]";

            // How do I know the table name is valid? It results in errors when it is not?
            // How to prevent it?
            using (var dataReader = cmd.ExecuteReader())
            {
                while (dataReader != null && dataReader.Read())
                {
                    // read the table here
                }
            }
        }
    }
}
catch (Exception e)
{
    MessageBox.Show(e.ToString());
}

【问题讨论】:

  • 如果我正确理解您想要的内容,您可以使用var schema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 获取表格列表。
  • @svinja 感谢 svinja 提供的线索,但您能告诉我名称列表保存在架构中的哪个位置吗?我没找到。
  • 代码开始加起来,所以我发布了一个答案。

标签: c# .net oledb datareader oledbconnection


【解决方案1】:

你可以得到表格列表

var schema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

并通过它们:

foreach (var row in schema.Rows.OfType<DataRow>())
{
    string tableName = row.ItemArray[2].ToString();
}

或检查是否存在:

if (schema.Rows
          .OfType<DataRow>()
          .Any(r => r.ItemArray[2].ToString().ToLower() == tablename.ToLower()))
{
    // table exists
}

丑陋,我知道。 :(

【讨论】:

  • 奇怪的是这些表存在于我的exe文件夹数据库中,但它没有显示在上面的代码中!
【解决方案2】:

这是我使用的一个可行的解决方案(在 VB.NET 中,但我想你可以找出 C# 的变体):

Dim myTable As Object, TableSchema As Object

Dim con As OleDb.OleDbConnection
con = New System.Data.OleDb.OleDbConnection
con.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" & myFileName & ";"

If Not con.State = ConnectionState.Open Then con.Open()
TableSchema = con.GetSchema("TABLES")

myTable = TableSchema.select("TABLE_NAME='MYTABLENAME'")
If myTable.length = 0 Then
    Dim cmd As New OleDb.OleDbCommand
    cmd.Connection = con
    cmd.CommandText = "CREATE TABLE MYTABLENAME;"
    nAffected = cmd.ExecuteNonQuery
End If

【讨论】:

    【解决方案3】:

    SQL 错误会抛出OleDbException,你可以check SQLState for specified error。如果该表不存在,根据Microsoft's documentation,代码应该是3376。所以你的代码应该是这样的

    catch (OleDbException e)
    { 
        switch (dbException.Errors[0].SQLState)
        {
            case "3376":
                MessageBox.Show(dbException.Errors[0].Message); // or any message
                break;
            default:
                MessageBox.Show(e.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多