Как я могу создать имя пользователя и защищенный паролем файл MS Access 2007 из C # и SQL? - PullRequest
1 голос
/ 25 ноября 2011

Я не очень разбираюсь в OleDB, и мне нужна информация о том, как создать файл MS Access 2007 как защищенный паролем. Это фрагмент кода, который использует User Id=admin; Password=, но при попытке сохранить сообщение выдает ошибку: Cannot start your application. The workgroup information file is missing or opened exclusively by another user.

EDIT: Теперь у меня ошибка: 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 + "[]";

РЕДАКТИРОВО изменил код, который у меня сейчас:

    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.");
    }

Надеюсь на несколько советов. Привет.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Открытие соединения с БД в эксклюзивном режиме , описанном в Работа с паролями базы данных в коде VBA .

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;");

Edit:

Выше приведено для "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;");
1 голос
/ 25 ноября 2011

Я не думаю, что вы можете изменить имя пользователя напрямую. Рассмотрим, чем SQL UPDATE аналогичен DELETE в сочетании с INSERT. Аналогично, объедините CREATE и DROP, например,

вместо (псевдокод)

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

try (фактический код):

CREATE USER onedaywhen pwd H3sJaZ9k2m;
DROP USER HelpNeeder;

Тогда GRANT у нового пользователя те же привилегии, что и у старого;)

p.s. Я не думаю, что имя пользователя и пароль могут быть параметризованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...