estou tentando depurar um comportamento muito estranho da minha aplicação: o problema é que quando o código chega ao blob.UploadFileAsync
eu tenho uma exceção dizendo que o arquivo em questão é utilizado por outro processo. se eu tentar executar apenas esse trecho de código, ele carregará o arquivo normalmente. este é o método de chamada:
private async void CreateAccount_Click(object sender, RoutedEventArgs e)
{
string from = "[email protected]";
string email = txtEmail.Text;
string password = PasswordGenerator.GenerateRandomPassword();
try
{
if (ValidateEmail(email) == 1)
{
bool userExists = await databaseManager.CheckIfExistsAsync("users", "userName", email);
if (userExists)
{
((MapViewModel)DataContext).MyVariable = "user already exists";
return;
}
else
{
string subject = "new account";
string bodyemail = $"Dear,Your new password is: {password}";
((MapViewModel)DataContext).MyVariable = "please wait";
await Task.Run(() => emailService.SendEmail(from, email, subject, bodyemail));
object[] values = { email, password, "editor" };
string result = await databaseManager.InsertDataAsync("users", values);
//upload the db on the cloud
try
{
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string relativePath = @"filesystem\database\MainDatabase.db";
string fullPath = System.IO.Path.Combine(baseDirectory, relativePath);
blobMan blob = new();
await blob.UploadFileAsync(fullPath, "database");
((MapViewModel)DataContext).MyVariable = "user successfully added, check your email";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
else
{
((MapViewModel)DataContext).MyVariable = "you need to insert a valid Email";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
se eu executar, await blob.UploadFileAsync(fullPath, "database");
ele funciona perfeitamente, então isolei o problema nos dois métodos que interagem com o banco de dados. aqui estão os métodos:
public async Task<bool> CheckIfExistsAsync(string tableName, string columnName, string, data)
{
try
{
string query = $"SELECT COUNT(*) FROM {tableName} WHERE {columnName} = @Data";
using (SqliteConnection connection = new SqliteConnection(connectionString))
{
await connection.OpenAsync();
using (SqliteCommand command = new SqliteCommand(query, connection))
{
command.Parameters.AddWithValue("@Data", data);
long count = (long)await command.ExecuteScalarAsync();
await connection.CloseAsync();
return count > 0;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error checking if data exists in database: {ex.Message}");
return false;
}
}
public async Task<string> InsertDataAsync(string tableName, params object[] values)
{
try
{
string query = $"INSERT INTO {tableName} VALUES ({string.Join(", ", Enumerable.Range(0, values.Length).Select(i => $"@Value{i + 1}"))})";
using (SqliteConnection connection = new SqliteConnection(connectionString))
{
await connection.OpenAsync();
using (SqliteCommand command = new SqliteCommand(query, connection))
{
for (int i = 0; i < values.Length; i++)
{
command.Parameters.AddWithValue($"@Value{i + 1}", values[i]);
}
await command.ExecuteNonQueryAsync();
}
}
return "ok";
}
catch (Exception ex)
{
Debug.WriteLine($"Error inserting data into database: {ex.Message}");
return "error";
}
}
fiz bom uso da instrução Using para liberar a conexão com o banco de dados. Também tentei várias vezes chamar o método connection.closeAsync() mas não mudou nada. Não consigo descobrir qual parte do código está bloqueando meu arquivo de banco de dados, impossibilitando o upload.
Isso provavelmente se deve ao pool de conexões (consulte https://docs.devart.com/dotconnect/sqlite/FAQ.html#q54 ).
Tente adicionar
Pooling=false
ao seu ConnectionString.