Hemos estado buscado en el mundo online para así traerte la respuesta para tu problema, si continúas con alguna inquietud déjanos tu pregunta y te respondemos con mucho gusto, porque estamos para ayudarte.
Solución:
Cuando especifica una contraseña en la conexión string, y la base de datos ya existe, SQLite asume que la base de datos está cifrada e intentará descifrarla con dicha contraseña. Si aún no ha establecido una contraseña en la base de datos, se producirá el error “el archivo está cifrado”, ya que la contraseña proporcionada no se puede utilizar para descifrar una base de datos no cifrada.
Puede eliminar la base de datos y SQLite creará una nueva base de datos cifrada utilizando la contraseña en la conexión string. O puede encriptar su base de datos existente usando el ChangePassword()
método:
// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");
Referencia: Cifrar, descifrar y adjuntar a bases de datos cifradas
La respuesta de 2Toad es en su mayoría correcta, pero quería agregar la mía porque hay que hacer algunas aclaraciones. Como dijo 2Toad, esto es correcto:
Cuando especifica una contraseña en la conexión string, y la base de datos ya existe, SQLite asume que la base de datos está cifrada e intentará descifrarla con dicha contraseña. Si aún no ha establecido una contraseña en la base de datos, se producirá el error “el archivo está cifrado”, ya que la contraseña proporcionada no se puede utilizar para descifrar una base de datos no cifrada.
Pero este error también puede ocurrir si intenta usar conn.SetPassword("something")
después de que ya tenías otro en la conexión string. o si lo haces conn.ChangePassword("somethingelse")
pero todavía tengo Password=something
en la conexión string.
Hay varios escenarios a considerar:
- Se ha aplicado una contraseña a la base de datos y está en la conexión string.
- Tienes una contraseña en la conexión. stringpero la base de datos no tiene uno aplicado, o la contraseña en el string no coincide con la base de datos.
- La base de datos nunca ha tenido una contraseña y desea cambiarla.
- La base de datos tiene una contraseña y desea cambiarla.
Resoluciones:
-
Así que el código 2Toad proporcionado para realizar
conn.ChangePassword("somethingelse")
es solo medio correcto y no tiene en cuenta dónde se encuentra, qué más ha hecho y qué quiere hacer en el futuro. Si tiene una contraseña existente y desea cambiarla, esto es correcto, pero también debe asegurarse de que la conexión string se actualiza después, o las conexiones subsiguientes fallarán con elfile is encrypted
error. -
Este escenario ocurre si borra la contraseña usando
conn.SetPassword("")
y luego intentaconn.ChangePassword("somethingelse")
sin conectarse primero a la base de datos sin elPassword=something
en la conexión string. EsePassword=something
tendría que ser eliminado de la conexión string, porque la contraseña se eliminó mediante programación de la base de datos y la base de datos intentará conectarse con eso. Si no se elimina de la conexión string al mismo tiempo que se elimina de la base de datos mediante programación, obtendrá el mismofile is encrypted
error. -
Porque comencé haciendo un
conn.SetPassword("something")
al principio, cuando no tenía una contraseña aplicada (y creo que esta es la forma de hacerlo), no puedo verificar lo siguiente sin crear otra base de datos SQLite, pero no creo que pueda llamarconn.ChangePassword("something")
si nunca tuviste una contraseña en primer lugar. Deberías hacerconn.SetPassword("something")
para el conjunto inicial, y luego ponerPassword=something
en tu conexión string. -
La forma en que hice un cambio de contraseña fue donde lo hice
conn.ChangePassword("somethingelse")
solo despues de hacerconn.SetPassword("")
y limpiando elPassword=something
de la conexión string:// Changes an encrypted database to unencrypted and removes password string connString = "Data Source=c:\test.db3;Password=something"; SQLiteConnection conn = new SQLiteConnection(connString); conn.SetPassword(""); //conn.Open(); // doesn't work because connString hasn't been updated // Update connString connString = "Data Source=c:\test.db3;"; conn = new SQLiteConnection(connString); conn.Open(); // we've opened the DB without a password // Re-encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating. conn.ChangePassword("somethingelse"); conn.Close(); // Update connString connString = "Data Source=c:\test.db3;Password=somethingelse"; conn = new SQLiteConnection(connString); // must re-instantiate! conn.Open(); // we've opened the DB with our new password
Esto funcionó bien. Supongo que tampoco puedes borrarlo de la conexión. string y simplemente hacer conn.ChangePassword("somethingelse")
y luego agregue Password=somethingelse
para usted stringdespués:
// Opens an encrypted database
string connString = "Data Source=c:\test.db3;Password=something";
SQLiteConnection conn = new SQLiteConnection(connString);
conn.Open();
// Encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.
conn.ChangePassword("somethingelse");
conn.Close();
// Update connString
connString = "Data Source=c:\test.db3;Password=somethingelse";
conn = new SQLiteConnection(connString);
conn.Open(); // we've opened the DB with our new password
Personalmente, guardo la contraseña cifrada en un archivo .config de la aplicación (web) y la llamo a una variable en mi aplicación onload y construyo dinámicamente mi conexión string de eso.
Que yo sepa, si elimina una base de datos SQLite e intenta llamarla, simplemente obtendrá un error, no una base de datos SQLite recreada con una nueva contraseña de su conexión string – al menos cuando se usa y se llama desde una aplicación C# .NET.
ACTUALIZAR Si necesita una función que se usará para actualizar la contraseña después de que ya tenga una, no querrá tener .SetPassword()
pero .ChangePassword()
. Descubrí que también es mejor dejarlo siempre en blanco y luego cambiarlo, como en mi primer ejemplo en el n.° 4.
Eres capaz de añadir valor a nuestro contenido informacional añadiendo tu veteranía en las referencias.