在打开之前验证数据库文件架构

Posted

技术标签:

【中文标题】在打开之前验证数据库文件架构【英文标题】:Validate database file schema before open 【发布时间】:2011-08-22 10:17:11 【问题描述】:

我有一个保存和打开数据的应用程序(保存为 SQL CE 数据库文件)。每次保存项目时,都会生成一个新的 .sdf 文件,其中包含我的代码定义的表结构,我不需要对其进行任何验证。

我担心当用户在OpenFileDialog 中导入(打开).sdf 文件时,用户可能会选择从不同应用程序生成的数据库文件(即具有不同的表架构)。我需要验证导入的数据库表架构,否则如果打开和处理了错误的数据库文件,应用程序可能会崩溃。

我不需要比较文件之间的架构。我只需要检查数据库文件是否包含某个表结构或表名(我认为这对于我的目的应该足够了)。最简单的方法是什么?

[编辑]

我使用以下方法来验证数据库文件,它有效。我使用一个字符串数组来检查一个 SqlCeDataReader(它存储了表名)。它有效,但我想知道是否有更简单的方法 - .NET 中是否有内置方法可供使用?

using (SqlCeConnection conn = new SqlCeConnection(validateConnStr))

    using (SqlCeCommand cmd = new SqlCeCommand(@"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES", conn))
    
        try
        
            conn.Open();
            SqlCeDataReader rdr = cmd.ExecuteReader();
            string[] tableArr =  "FirstTable", "SecondTable" ;
            int ta = 0;
            while (rdr.Read())
            
                if (rdr.GetString(0) != tableArr[ta])
                
                    isValidDbFile = false;
                
                else
                
                    isValidDbFile = true;
                
                ta++;
            
        
        catch (Exception ex)
        
            //MessageBox.Show(ex.ToString());
        
        finally
        
            conn.Close();
        
    

【问题讨论】:

如果你使用的是4.0,你也可以使用GetSchema("TABLES"),它返回一个带有表名的DataTable。 【参考方案1】:

打开数据库(确保对此进行错误处理,因为用户可以指向任何文件)。

运行:SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'MyTable'

如果这返回数据,您的表就在那里。

【讨论】:

以上是关于在打开之前验证数据库文件架构的主要内容,如果未能解决你的问题,请参考以下文章

Azure 文件存储在删除本地副本之前上传后验证文件

无法打开物理文件 错误 怎么解决

验证 XSD 架构?

在 C# 中针对引用的 XSD 验证 XML

Formality形式验证教程

如何验证pig中的数据类型?