【问题标题】:How can I create user name and password protected MS Access 2007 file from C# and SQL?如何从 C# 和 SQL 创建受用户名和密码保护的 MS Access 2007 文件?
【发布时间】:2012-01-06 01:37:58
【问题描述】:

我对 OleDB 了解不多,我需要一些有关如何创建受密码保护的 MS Access 2007 文件的信息。这是一段使用 User Id=admin; Password= 的代码,但它在尝试保存时给了我一个错误:Cannot start your application. The workgroup information file is missing or opened exclusively by another user.

编辑: 现在我有错误:Cannot open the MS Office Access database engine workgroup information file

我发现问题在于 SQL 命令。我应该使用什么 SQL 命令?这个命令产生了一个问题,我不知道为什么。我在评论中提供的链接中使用了类似的语法。

    try
    {
        objOleDbConnection.Open();
        objOleDbCommand.CommandText = 
            "ALTER USER " + storedAuth.UserName + 
            " PASSWORD [" + storedAuth.Password + "] []";
        objOleDbCommand.ExecuteNonQuery();
    }

我可以使用下面的代码,但是用户名呢?

objOleDbCommand.CommandText = "ALTER DATABASE PASSWORD " + storedAuth.Password + "[]";

EDITTED 更改了我现在拥有的代码:

    private void sfdNewFile_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
    {
        // Creating a ADOX object needed to create
        // new MS Access file.
        ADOX.Catalog createMSFile = new ADOX.Catalog();

        createMSFile.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
            sfdNewFile.FileName);

        Table nTable = new Table();
        nTable.Name = "PersonData";
        nTable.Columns.Append("DataID", DataTypeEnum.adInteger, 40);
        nTable.Columns.Append("Type", DataTypeEnum.adVarWChar, 40);
        nTable.Columns.Append("URL", DataTypeEnum.adVarWChar, 40);
        nTable.Columns.Append("SoftwareName", DataTypeEnum.adVarWChar, 40);
        nTable.Columns.Append("SerialCode", DataTypeEnum.adVarWChar, 40);
        nTable.Columns.Append("UserName", DataTypeEnum.adVarWChar, 40);
        nTable.Columns.Append("Password", DataTypeEnum.adVarWChar, 40);

        createMSFile.Tables.Append(nTable);

        // It is importnat to release COM object, in this very order
        // otherwise we eill end up with an error.
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(nTable);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(createMSFile.Tables);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(createMSFile.ActiveConnection);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(createMSFile);

        OleDbConnection objOleDbConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" +
                "Data Source=" + sfdNewFile.FileName);
        OleDbCommand objOleDbCommand = objOleDbConnection.CreateCommand();

        try
        {
            objOleDbConnection.Open();
            objOleDbCommand.CommandText = "ALTER DATABASE PASSWORD [" + storedAuth.Password + "] []";
            objOleDbCommand.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            // Displaying any errors that 
            // might have occured.
            MessageBox.Show("Error opening the " +
            "connection: " + ex.Message);
        }
        finally
        {
            objOleDbConnection.Close();
        }

        MessageBox.Show("File have been created.");
    }

希望得到一些提示。问候。

【问题讨论】:

标签: c# sql ms-access ado


【解决方案1】:

exclusive mode 中打开与数据库的连接,在Working with Database Passwords in VBA Code 中进行了描述。

OleDbConnection objOleDbConnection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0;" +
    "Data Source=" + sfdNewFile.FileName + ";Exclusive=1;");

这也应该可以正常工作:

OleDbConnection objOleDbConnection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0;" + 
    "Data Source=" + sfdNewFile.FileName + ";Mode=12;");

编辑:

以上为“Cannot change password on a shared open database.”。

如果您仍然遇到Cannot open the MS Office Access database engine workgroup information file 错误,请尝试将Jet OLEDB:System database 添加到指向System.MDW 文件的连接字符串(使用“搜索”找到它)。它可能看起来像:

OleDbConnection objOleDbConnection = new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0" +
    ";Data Source=" + sfdNewFile.FileName + 
    ";Jet OLEDB:System database=C:\...\System.MDW"
    ";Exclusive=1;");

【讨论】:

    【解决方案2】:

    我认为您不能直接更改用户名。考虑一下 SQL UPDATE 类似于 DELETEINSERT 的组合。同样,结合 CREATEDROP 例如

    而不是(伪代码)

    ALTER USER HelpNeeder SET uid = onedaywhen; -- no such syntax
    

    尝试(实际代码):

    CREATE USER onedaywhen pwd H3sJaZ9k2m;
    DROP USER HelpNeeder;
    

    然后GRANT新用户和旧用户具有相同的权限;)

    附言我不认为用户名和密码值可以参数化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多