Discussione:
Risorse di sistema insufficienti
(troppo vecchio per rispondere)
Nick
2007-01-08 15:51:29 UTC
Permalink
Ciao a tutti,
ho realizzato una piccola procedura per recuperare i dati da un file di
testo e inserirli in un database access; tecnicamente funziona tutto,
solo che se faccio l'importazione dell'intero archivio, dopo circa 2000
righe il programma si pianta emettendo il messaggio "Risorse di sistema
insufficienti". Il codice che ho usato è il seguente:


private void button1_Click(object sender, EventArgs e)
{
StreamReader objReader = new StreamReader("e:\\file.txt");
string sLine = "";

string str1, str2, str3, str4, str5, str6, str7, str8;
string stringaSql;

while (sLine != null)
{
sLine = objReader.ReadLine();
campo1 = sLine.Substring(1, 4).Replace(" ", "0");
campo2 = sLine.Substring(8, 39).Trim().Replace("'", "''");
sLine = objReader.ReadLine();
campo3 = sLine.Substring(8, 32).Trim().Replace("'", "''");
campo4 = sLine.Substring(41, 5).Trim();
campo5 = sLine.Substring(48, 22).Trim().Replace("'", "''");
campo6 = sLine.Substring(71, 2).Trim();
campo7 = sLine.Substring(83, 18).Trim();
campo8 = sLine.Substring(101, 18).Trim();
stringaSql = "INSERT INTO tabella (campo1, campo2, campo3,
campo4, campo5, campo6, campo7, campo8) " +
"VALUES('" + str1 + "', '" + str2 + "', '" + str3 + "', '"
+ str4 + "', '" + str5 + "', '" + str6 + "', '" + str7 + "', '" + str8
+ "')";
EseguiQuery(stringaSql);
sLine = objReader.ReadLine();
}

objReader.Close();
MessageBox.Show("Fatto");
}


private void EseguiQuery(string stringaSql)
{
try
{
dataConnection.ConnectionString = connectionString;
dataConnection.Open();

OleDbCommand dataCommand = new OleDbCommand();
dataCommand.Connection = dataConnection;

dataCommand.CommandText = stringaSql;
dataCommand.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show("Errore nell'accesso al database: " +
e.Message);
MessageBox.Show(stringaSql);
}
finally
{
dataConnection.Close();
}
}


Qualcuno sa dirmi dove sbaglio?
Nick
[dKk]
2007-01-08 15:56:16 UTC
Permalink
Non esegui il Dispose dell'oggetto dataConnection.

Ciao
Post by Nick
Ciao a tutti,
ho realizzato una piccola procedura per recuperare i dati da un file di
testo e inserirli in un database access; tecnicamente funziona tutto,
solo che se faccio l'importazione dell'intero archivio, dopo circa 2000
righe il programma si pianta emettendo il messaggio "Risorse di sistema
private void button1_Click(object sender, EventArgs e)
{
StreamReader objReader = new StreamReader("e:\\file.txt");
string sLine = "";
string str1, str2, str3, str4, str5, str6, str7, str8;
string stringaSql;
while (sLine != null)
{
sLine = objReader.ReadLine();
campo1 = sLine.Substring(1, 4).Replace(" ", "0");
campo2 = sLine.Substring(8, 39).Trim().Replace("'", "''");
sLine = objReader.ReadLine();
campo3 = sLine.Substring(8, 32).Trim().Replace("'", "''");
campo4 = sLine.Substring(41, 5).Trim();
campo5 = sLine.Substring(48, 22).Trim().Replace("'", "''");
campo6 = sLine.Substring(71, 2).Trim();
campo7 = sLine.Substring(83, 18).Trim();
campo8 = sLine.Substring(101, 18).Trim();
stringaSql = "INSERT INTO tabella (campo1, campo2, campo3,
campo4, campo5, campo6, campo7, campo8) " +
"VALUES('" + str1 + "', '" + str2 + "', '" + str3 + "', '"
+ str4 + "', '" + str5 + "', '" + str6 + "', '" + str7 + "', '" + str8
+ "')";
EseguiQuery(stringaSql);
sLine = objReader.ReadLine();
}
objReader.Close();
MessageBox.Show("Fatto");
}
private void EseguiQuery(string stringaSql)
{
try
{
dataConnection.ConnectionString = connectionString;
dataConnection.Open();
OleDbCommand dataCommand = new OleDbCommand();
dataCommand.Connection = dataConnection;
dataCommand.CommandText = stringaSql;
dataCommand.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show("Errore nell'accesso al database: " +
e.Message);
MessageBox.Show(stringaSql);
}
finally
{
dataConnection.Close();
}
}
Qualcuno sa dirmi dove sbaglio?
Nick
Nick
2007-01-08 16:47:59 UTC
Permalink
Post by [dKk]
Non esegui il Dispose dell'oggetto dataConnection.
Ciao
Ti ringrazio per la risposta; ho fatto come hai detto, ma il problema
persiste:

public void EseguiQuery(string stringaSql)
{
try
{
dataConnection.ConnectionString = connectionString;
dataConnection.Open();

OleDbCommand dataCommand = new OleDbCommand();
dataCommand.Connection = dataConnection;

dataCommand.CommandText = stringaSql;
dataCommand.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show("Errore nell'accesso al database: " +
e.Message);
MessageBox.Show(stringaSql);
}
finally
{
dataConnection.Close();
dataConnection.Dispose();
}
}

ho anche provato a mettere il Dispose prima del Close, ma non risolvo
il problema.
La cosa che mi suona strana è che la procedura si ferma sempre sul
medesimo "record", per la precisione il 1042 (ossia alla riga 3124 del
file di testo). Se fosse realmente un problema di risosre, immagino che
l'interruzione avverebbe ogni volta in punti diversi, o sbaglio? Ho
anche eliminato il record presente in tale posizione, supponendo che ci
fosse un qualche problema nella stringa, ma anche questo non risolve.

Nick
Cristiano Larghi
2007-01-08 16:54:01 UTC
Permalink
Post by Nick
La cosa che mi suona strana è che la procedura si ferma sempre sul
medesimo "record", per la precisione il 1042 (ossia alla riga 3124 del
file di testo).
Se togli la chiamata al metodo che esegue la query cosa fa? Riesce ad
arrivare alla fine del file oppure si inchioda uguale?
--
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"

B.M.
Nick
2007-01-08 16:59:35 UTC
Permalink
Post by Cristiano Larghi
Se togli la chiamata al metodo che esegue la query cosa fa? Riesce ad
arrivare alla fine del file oppure si inchioda uguale?
Arriva regolarmente alla fine del file.
Nick
Raffaele Rialdi [MVP]
2007-01-08 21:38:53 UTC
Permalink
Post by Nick
while (sLine != null)
{
sLine = objReader.ReadLine();
[...]
Post by Nick
EseguiQuery(stringaSql);
sLine = objReader.ReadLine();
}
La doppia readline è sicuramente sbagliata, questo fa si che dopo la prima
potresti essere già alla fine del file, risultando in una lettura errata di
dati.

Inoltre visto che il loop è continuo, la crezione ad ogni riga di una
connection è solo tempo sprecato.
Apri la connection all'inizio e chiudila alla fine.

E ancora quando ci sono degli oggetti che implementano dispose è meglio
usare lo statement using di C# al posto della close esplicita.
La close esplicita non viene chiamata in caso di eccezione. Lo statamente
using è invece un alias per un blocco try/finally.

Infine devi necessariamente gestire l'eccezione. Non solo perché è possibile
che una riga sia mal formattata (e la tua procedura crasherebbe all'istante)
ma anche perché l'exception ha molti altri indicatori che ti fanno capire
dov'è l'errore.
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Loading...