¿Cómo puedo crear un file MS Access 2007 protegido por contraseña y nombre de usuario desde C # y SQL?

No sé mucho sobre OleDB y necesito información sobre cómo crear un file de MS Access 2007 protegido con contraseña. Este es un fragment de código que usa User Id=admin; Password= User Id=admin; Password= pero me da un error al intentar save diciendo: Cannot start your application. The workgroup information file is missing or opened exclusively by another user. Cannot start your application. The workgroup information file is missing or opened exclusively by another user.

EDITAR: ahora tengo un error: Cannot open the MS Office Access database engine workgroup information file

He descubierto que los problemas se encuentran en el command SQL. ¿Qué command SQL debería usar? Este command crea un problema y no puedo entender por qué. He utilizado una syntax similar del enlace que esa persona proporcionó en el comentario.

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

Podría usar el siguiente código, pero ¿qué pasa con el nombre de usuario?

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

EDITADO cambió el código de lo que tengo ahora:

  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 [" + stonetworkingAuth.Password + "] []"; objOleDbCommand.ExecuteNonQuery(); } catch (Exception ex) { // Displaying any errors that // might have occunetworking. MessageBox.Show("Error opening the " + "connection: " + ex.Message); } finally { objOleDbConnection.Close(); } MessageBox.Show("File have been created."); } 

Espero algunos consejos. Saludos.

Abra la connection a DB en modo exclusivo , descrito en Trabajo con passwords de bases de datos en código VBA .

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

esto debería funcionar bien también:

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

Editar:

Lo anterior es para " Cannot change password on a shanetworking open database. ".

Si aún tiene un error Cannot open the MS Office Access database engine workgroup information file intente agregar Jet OLEDB:System database de Jet OLEDB:System database a la cadena de connection que apunta al file System.MDW (ubíquelo usando "search"). Puede ser como:

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

No creo que puedas cambiar un nombre de usuario directamente. Considere que una UPDATE SQL es análoga a un DELETE combinado con un INSERT . Del mismo modo, combine CREATE y DROP por ejemplo

en lugar de (pesudocódigo)

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

testing (código real):

 CREATE USER onedaywhen pwd H3sJaZ9k2m; DROP USER HelpNeeder; 

A continuación, GRANT al nuevo usuario los mismos privilegios que el anterior;)

ps No creo que los valores de nombre de usuario y contraseña puedan parametrizarse.