Impossibile accedere a file access da c#

di il
19 risposte

Impossibile accedere a file access da c#

Buongiorno ancora, questo argomento è sempre basato sul timesheet .

Il software, nella sezione di login del timesheet, apre un file chiamato "Utenti.mdb" con password e controlla tutti gli utenti e tutte le password. Ogni utente trovate nel file "Utenti.mdb" le inserisce in una combobox dove l'utente può scegliere un utente ed inserendo la propria password, può accedere alla sua area personale.

Ora il succo dell'argomento: il problema è che, quando cerca di accedere al file "Utenti.mdb",<b>causa un errore</b>:
[CODE]System.Data.OleDb.OleDbException (0x80004005): Il motore di database di Microsoft Access non è in grado di aprire il file '\\192.168.100.129\Time-Sheet\Utenti.mdb' o di scrivere su tale file. Il file è già aperto con accesso esclusivo da un altro utente o è necessario disporre dell'autorizzazione per visualizzare i dati o scrivere. Il file si trova sul nas ed ho i permessi di aprire il file (poichè ho provato ad aprirlo con access e tutto va bene).

La cosa strana e che andando su un altro computer avente la stessa versione del software non va in errore e funziona normalmente .

19 Risposte

  • Re: Impossibile accedere a file access da c#

    Ciao

    In passato ho avuto problemi con accesso ai file di rete, poichè io chiudevo il file ma la rete per un pò di tempo continuava a vederlo in uso.

    Può essere un problema simile?
  • Re: Impossibile accedere a file access da c#

    PiGi78 ha scritto:


    Ciao

    In passato ho avuto problemi con accesso ai file di rete, poichè io chiudevo il file ma la rete per un pò di tempo continuava a vederlo in uso.

    Può essere un problema simile?
    Forse, ma come posso sapere che il nas contina a vederlo in uso?
  • Re: Impossibile accedere a file access da c#

    Quello lo puoi verificare solo con dei test.

    Altro caso che a volte mi ha creato problemi: dal PC in cui esce con errore puoi creare/cancellare dei file nella stessa cartella in cui risiede il file Utenti.mdb?

    Se ricordo bene il motore di Access crea/gestisce dei file temporanei nella cartella e, se non si possono scrivere, esce con errori fuorvianti.
  • Re: Impossibile accedere a file access da c#

    PiGi78 ha scritto:


    Quello lo puoi verificare solo con dei test.

    Altro caso che a volte mi ha creato problemi: dal PC in cui esce con errore puoi creare/cancellare dei file nella stessa cartella in cui risiede il file Utenti.mdb?

    Se ricordo bene il motore di Access crea/gestisce dei file temporanei nella cartella e, se non si possono scrivere, esce con errori fuorvianti.
    Infatti, nel nas c'è una cartella denominata "recycle", in questa cartella ci sono tutti i file/cartelle cancellati.
    È guarda un pò: una miriade di file .lcd (da Utenti_1.lcd (non ricordo bene il nome a Utenti_3036) ???!
    Io li ho cancellati ma niente successo...
  • Re: Impossibile accedere a file access da c#

    Ciao,
    l'errore che ti genera è abbastanza esplicativo ... dovresti controllare se il db in questione è aperto ancora da qualche pc in rete e soprattutto tu come accedi al db Access sul NAS ... se puoi mostraci il tuo codice di accesso così ci fornisci info in più per esserti di aiuto.

    Una soluzione potrebbe essere di tentare e riuscire a chiudere "sempre" il db access prima di riaprirlo.
    BYeee
  • Re: Impossibile accedere a file access da c#

    dpsandro ha scritto:


    Ciao,
    l'errore che ti genera è abbastanza esplicativo ... dovresti controllare se il db in questione è aperto ancora da qualche pc in rete e soprattutto tu come accedi al db Access sul NAS ... se puoi mostraci il tuo codice di accesso così ci fornisci info in più per esserti di aiuto.

    Una soluzione potrebbe essere di tentare e riuscire a chiudere "sempre" il db access prima di riaprirlo.
    BYeee
    Ecco il codice:

    [CODE]using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using Microsoft.VisualBasic; using System.Media; using System.Data.OleDb; namespace Sliding_Menu_1._0 { public partial class login_form : Form { public login_form() { InitializeComponent(); } private void guna2TextBox1_OnValueChanged(object sender, EventArgs e) { } private void guna2ComboBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void bunifuFlatButton1_Click(object sender, EventArgs e) { Console.WriteLine(Config.FileUtentiPWD()); OleDbConnection cnn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD()); OleDbCommand cm1 = new OleDbCommand("Select * from Utenti WHERE Visualizzato='yes' AND Nome_Utente='" + guna2ComboBox1.Text + "' AND Pass='" + guna2TextBox1.Text + "'", cnn1); OleDbDataReader reader; cnn1.Open(); reader = cm1.ExecuteReader(); if (reader.Read() == true) { Properties.Settings.Default.user_name = reader.GetString(0); Home_Page home = new Home_Page(); this.Hide(); home.Show(); } else { SoundPlayer simpleSound = new SoundPlayer(Properties.Resources.error); simpleSound.Play(); Properties.Settings.Default.typeo = "Errore"; Properties.Settings.Default.typeo = "Errore"; Properties.Settings.Default.title = "Errore"; Properties.Settings.Default.typeo = "Errore"; Properties.Settings.Default.Save(); Properties.Settings.Default.message = "Nome o password errati"; Properties.Settings.Default.Save(); message_showing message = new message_showing(); message.ShowDialog(); } reader.Close(); cnn1.Close(); } private void guna2CirclePictureBox1_Click(object sender, EventArgs e) { if (guna2TextBox1.UseSystemPasswordChar == false) { guna2TextBox1.UseSystemPasswordChar = true; guna2CirclePictureBox1.BackgroundImage = Properties.Resources.eye_40px; return; } if (guna2TextBox1.UseSystemPasswordChar == true) { guna2TextBox1.UseSystemPasswordChar = false; guna2CirclePictureBox1.BackgroundImage = Properties.Resources.closed_eye_40px; return; } } private void guna2TextBox1_TextChanged(object sender, EventArgs e) { } private void guna2TextBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { bunifuFlatButton1_Click(sender, e); e.Handled = true; } } private void guna2ComboBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { bunifuFlatButton1_Click(sender, e); e.Handled = true; } } bool isAdmin() { if(UtentiList.tipo != "admin") { return false; } else { return true; } } private void login_form_Load(object sender, EventArgs e) { Panel pnlTop = new Panel() { Height = 4, Dock = DockStyle.Top, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlTop); Panel pnlRight = new Panel() { Width = 4, Dock = DockStyle.Right, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlRight); Panel pnlBottom = new Panel() { Height = 4, Dock = DockStyle.Bottom, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlBottom); Panel pnlLeft = new Panel() { Width = 4, Dock = DockStyle.Left, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlLeft); OleDbConnection cnn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD()); OleDbCommand cm1 = new OleDbCommand("Select * from Utenti WHERE Visualizzato = 'yes' OR Visualizzato = 'Si' OR Visualizzato = 'si'", cnn1); OleDbDataReader reader; cnn1.Open(); reader = cm1.ExecuteReader(); while (reader.Read()) { guna2ComboBox1.Items.Add(reader.GetString(0)); } OleDbConnection cnn2 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD()); OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn2); OleDbDataReader reader2; cnn2.Open(); reader2 = cm2.ExecuteReader(); UtentiList.utenti.Clear(); while (reader2.Read()) { UtentiList.utenti.Add(reader2.GetString(0)); } reader.Close(); cnn1.Close(); reader2.Close(); cnn2.Close(); for (int k = 0; k < UtentiList.utenti.Count; k++) { if (UtentiList.utenti[k].ToString() == "Administrator") { UtentiList.utenti.RemoveAt(k); break; } } if(isAdmin()) { } else { for(int i = 0;i < guna2ComboBox1.Items.Count;i++) { if(guna2ComboBox1.Items[i].ToString() == "Administrator") { guna2ComboBox1.Items.RemoveAt(i); } } } Guna.UI2.WinForms.Guna2AnimateWindow animatewindow = new Guna.UI2.WinForms.Guna2AnimateWindow(); animatewindow.SetAnimateWindow(this, Guna.UI2.WinForms.Guna2AnimateWindow.AnimateWindowType.AW_BLEND, 700); } private void guna2ControlBox1_Click(object sender, EventArgs e) { Application.Exit(); } } }

    dpsandro ha scritto:


    e soprattutto tu come accedi al db Access sul NAS
    accedo con la vpn poi apro explorer e scrivo un percorso di rete: \\192.168.100.129\ faccio il login con username e password, vado nella cartella Time-sheet ed la c'è il file, doppio click e si apre microsoft access
  • Re: Impossibile accedere a file access da c#

    Non ne sono sicuro al 100%, però per me il problema è nel codice.

    Le classi OleDbCommand ed OleDbConnection sono di tipo IDisposable, interfaccia creata apposta per gestire il rilascio delle risorse appena possibile e non quando si attiva il Garbage Collector.

    Prova ad utilizzare la clausola "using" quando lavori con OleDbCommand e OleDbConnection e vedi se si risolve il problema.

    Grosso modo qualcosa del genere:
    
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        using (OleDbCommand command = new OleDbCommand(queryString, connection))
        {
            connection.Open();
            OleDbDataReader reader = command.ExecuteReader();
    
            while (reader.Read())
            {
                Console.WriteLine(reader[0].ToString());
            }
            reader.Close();
        }
    
    
  • Re: Impossibile accedere a file access da c#

    Ti farò sapere
  • Re: Impossibile accedere a file access da c#

    Attenzione anche al fatto che le variabili cnn1 e cnn2 usano la stessa stringa di connessione e vengono aperte una dopo l'altra... Prova ad usarne una sola seguendo il consiglio di PiGi78 e ad impostare [CODE]OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1); racchiudendo l'esecuzione di entrambi i comandi dentro il blocco using.
  • Re: Impossibile accedere a file access da c#

    Sgrubak ha scritto:


    Attenzione anche al fatto che le variabili cnn1 e cnn2 usano la stessa stringa di connessione e vengono aperte una dopo l'altra... Prova ad usarne una sola seguendo il consiglio di PiGi78 e ad impostare [CODE]OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1); racchiudendo l'esecuzione di entrambi i comandi dentro il blocco using.
    Grazie! Ora cerco di fixare il codice con i consigli che mi avete detto. Vi farò sapere
  • Re: Impossibile accedere a file access da c#

    Brutte notizie: niente da fare, stesso errore...

    Il codice l'ho transformato così: [CODE] private void login_form_Load(object sender, EventArgs e) { Panel pnlTop = new Panel() { Height = 4, Dock = DockStyle.Top, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlTop); Panel pnlRight = new Panel() { Width = 4, Dock = DockStyle.Right, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlRight); Panel pnlBottom = new Panel() { Height = 4, Dock = DockStyle.Bottom, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlBottom); Panel pnlLeft = new Panel() { Width = 4, Dock = DockStyle.Left, BackColor = Color.FromArgb(0, 102, 204) }; this.Controls.Add(pnlLeft); using (OleDbConnection cnn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD())) using (OleDbCommand cm1 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1)) { cnn1.Open(); OleDbDataReader reader = cm1.ExecuteReader(); while (reader.Read()) { if(reader.GetString(2) == "Yes" || reader.GetString(2) == "yes" || reader.GetString(2) == "Si" || reader.GetString(2) == "si") { guna2ComboBox1.Items.Add(reader.GetString(0)); } else { UtentiList.utenti.Add(reader.GetString(0)); guna2ComboBox1.Items.Add(reader.GetString(0)); } } reader.Close(); cnn1.Close(); } UtentiList.utenti.Add("Administrator"); using (OleDbConnection cnn2 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD())) using (OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn2)) { cnn2.Open(); OleDbDataReader reader2 = cm2.ExecuteReader(); UtentiList.utenti.Clear(); while (reader2.Read()) { UtentiList.utenti.Add(reader2.GetString(0)); } reader2.Close(); cnn2.Close(); }; for (int k = 0; k < UtentiList.utenti.Count; k++) { if (UtentiList.utenti[k].ToString() == "Administrator") { UtentiList.utenti.RemoveAt(k); break; } } if(isAdmin()) { for (int i = 0; i < guna2ComboBox1.Items.Count; i++) { if (guna2ComboBox1.Items[i].ToString() != "Administrator") { guna2ComboBox1.Items.Add("Administrator"); break; } } } else { for(int i = 0;i < guna2ComboBox1.Items.Count;i++) { if(guna2ComboBox1.Items[i].ToString() == "Administrator") { guna2ComboBox1.Items.RemoveAt(i); } } } Guna.UI2.WinForms.Guna2AnimateWindow animatewindow = new Guna.UI2.WinForms.Guna2AnimateWindow(); animatewindow.SetAnimateWindow(this, Guna.UI2.WinForms.Guna2AnimateWindow.AnimateWindowType.AW_BLEND, 700); } Ma da stesso errore, a questo punto penso che sia un problema del nas e non del software...
  • Re: Impossibile accedere a file access da c#

    AlessandroILTOP ha scritto:


    ...Ma da stesso errore, a questo punto penso che sia un problema del nas e non del software...
    Ma su che riga solleva l'eccezione?
    Prova a riadattare la parte delle connessioni così:[CODE] using (OleDbConnection cnn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD())) { using (OleDbCommand cm1 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1)) { cnn1.Open(); using (OleDbDataReader reader = cm1.ExecuteReader()) { while (reader.Read()) { guna2ComboBox1.Items.Add(reader.GetString(0)); if (reader.GetString(2).ToLower != "yes" || reader.GetString(2).ToLower != "si") UtentiList.utenti.Add(reader.GetString(0)); } } } UtentiList.utenti.Add("Administrator"); using (OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1)) { using (OleDbDataReader reader2 = cm2.ExecuteReader()) { UtentiList.utenti.Clear(); while (reader2.Read()) { UtentiList.utenti.Add(reader2.GetString(0)); } } } } Non vorrei che ad un certo punto qualche eccezione sui readers tenga il file bloccato.

    Verifica anche che nella cartella de DB, non siano presenti i file con estensione .ldb o .laccdb, come spiega a questo link.
  • Re: Impossibile accedere a file access da c#

    Sgrubak ha scritto:


    AlessandroILTOP ha scritto:


    ...Ma da stesso errore, a questo punto penso che sia un problema del nas e non del software...
    Ma su che riga solleva l'eccezione?
    Prova a riadattare la parte delle connessioni così:[CODE] using (OleDbConnection cnn1 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Config.FileUtenti() + ";Jet OLEDB:Database Password=" + Config.FileUtentiPWD())) { using (OleDbCommand cm1 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1)) { cnn1.Open(); using (OleDbDataReader reader = cm1.ExecuteReader()) { while (reader.Read()) { guna2ComboBox1.Items.Add(reader.GetString(0)); if (reader.GetString(2).ToLower != "yes" || reader.GetString(2).ToLower != "si") UtentiList.utenti.Add(reader.GetString(0)); } } } UtentiList.utenti.Add("Administrator"); using (OleDbCommand cm2 = new OleDbCommand("Select * from Utenti WHERE NOT Nome_Utente='Administrator'", cnn1)) { using (OleDbDataReader reader2 = cm2.ExecuteReader()) { UtentiList.utenti.Clear(); while (reader2.Read()) { UtentiList.utenti.Add(reader2.GetString(0)); } } } } Non vorrei che ad un certo punto qualche eccezione sui readers tenga il file bloccato.

    Verifica anche che nella cartella de DB, non siano presenti i file con estensione .ldb o .laccdb, come spiega a questo link.
    Ti farò sapere...

    Comunque, non ci sono file .lcd o .laccdb
  • Re: Impossibile accedere a file access da c#

    Come previsto, stesso errore...

    non posso vedere l'eccezione dato che sul mio laptop non c'è visual studio e si verifica soltanto sul laptop ..
Devi accedere o registrarti per scrivere nel forum
19 risposte