Erreur c#

Fermé
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014 - 30 mai 2014 à 15:12
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 - 2 juin 2014 à 15:56
Salut,
j'utilise visual studio 2010 et .net framework 4

quand j'execute mon code cette erreur s'affiche j'ai cherché sur internet et j'ai suivi tous les changements que j'ai trouvé mais sans aucun changement.

"Attempt to read or write Protected Memory This is often an indicating that other memory is corrupt"

je suis désespérée depuis 2 jours
voici mon code

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{

string connstring = "User Id=sonedee;Password=sonedee;Data Source=xe;";

OracleConnection conn = new OracleConnection(connstring);


OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;

conn.Open();
if (Convert.ToBoolean(row.Cells[0].Value) == true)
{
MessageBox.Show("convert to boolean = " + Convert.ToBoolean(row.Cells[0].Value));
//row.Selected = true;
MessageBox.Show("row checked= " + row);
if (!(row.Cells[15].ToString() == ""))
{
MessageBox.Show("1");
cmd.CommandText = "select distinct loc_nom,loc_matricule from s_localite";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
MessageBox.Show("2");
if (dr[0].ToString() == row.Cells[15].Value.ToString())
{
MessageBox.Show("3");
cmd.CommandText= "update s_adresse set loc_matricule=" + dr[1] + " where adr_id='" + row.Cells[1].Value+"'";
cmd.CommandType=CommandType.Text;
cmd.ExecuteNonQuery();

}
}
else
{
conn.Close();
MessageBox.Show("4");
OracleCommand cmd1 = new OracleCommand();
OracleCommand cmd2 = new OracleCommand();
OracleCommand cmd3 = new OracleCommand();
OracleCommand cmd4 = new OracleCommand();
OracleCommand cmd5 = new OracleCommand();
OracleCommand cmd6 = new OracleCommand();
OracleCommand cmd7 = new OracleCommand();
OracleCommand cmd8 = new OracleCommand();
cmd1.Connection = conn;
conn.Open();
cmd1.CommandText= "insert into s_localite values (seq.nextval,'" + row.Cells[15].Value + "','')";

cmd1.ExecuteNonQuery();
cmd2.Connection = conn;

cmd2.CommandText = "select * from s_delegation where deleg_libille_francais ='" + row.Cells[16].Value + "'";
cmd2.CommandType=CommandType.Text;
OracleDataReader dr2 = cmd2.ExecuteReader();

while (!(dr2.HasRows))
{
MessageBox.Show("5");
cmd3.Connection = conn;
cmd3.CommandText = "insert into s_delegation values (seq.nextval,'" + row.Cells[16].Value + "','','" + row.Cells[14].Value + "','')";
cmd3.CommandType = CommandType.Text;
cmd3.ExecuteNonQuery();

cmd4.Connection = conn;
cmd4.CommandText = "select deleg_matricule from s_delegation where deleg_libille_francais='" + row.Cells[16].Value + "' and deleg_adr_cpl ='" + row.Cells[14].Value + "'";
cmd4.CommandType = CommandType.Text;
OracleDataReader dr4 = cmd4.ExecuteReader();
MessageBox.Show("******16******** " + row.Cells[16].Value + " *******14******** " + row.Cells[14].Value);
//string a = dr4[0].ToString();
while (dr4.Read())
{
MessageBox.Show("6");
cmd6.Connection = conn;
cmd6.CommandText = "update s_localite set deleg_matricule='" + dr4[0].ToString() + "' where loc_nom ='" + row.Cells[15].Value + "'";
cmd6.CommandType = CommandType.Text;
cmd6.ExecuteNonQuery();
cmd7.Connection = conn;
cmd7.CommandText = "insert into s_gouvernorat values (seq.nextval,'" + row.Cells[17].Value + "','','') ";
cmd7.CommandType = CommandType.Text;
cmd7.ExecuteNonQuery();
cmd5.Connection = conn;
cmd5.CommandText = "select gouv_matricule from s_gouvernorat where gouv_libille_francais='" + row.Cells[17].Value + "'";
cmd5.CommandType = CommandType.Text;
OracleDataReader dr5 = cmd5.ExecuteReader();
if (dr5.HasRows){
MessageBox.Show("dr555= "+dr5[0]);
cmd8.Connection = conn;
cmd8.CommandText = "update s_delegation set gouv_matricule='" + dr5[0] + "' where deleg_matricule='" + dr4[0].ToString()+ "'";
cmd8.CommandType = CommandType.Text;
cmd8.ExecuteNonQuery();
}}
}

}

}
}
}
}


merci de me repondre :)

11 réponses

fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
30 mai 2014 à 19:09
Tu devrais essayer de décomposer l'égalité que tu test dans 2 variables, afin de vérifier si l'erreur provient du DataReader ou du DataGridView.

D'après moi ton utilisation des DataReader n'est pas adéquate, essaie de stocker les données que tu as besoin dans des variables plutôt qu'utiliser plusieurs DataReader simultanément. Garde ton code simple : 1 connexion, 1 commande et 1 data reader (que tu fermes quand tu as terminé).
1
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
30 mai 2014 à 20:22
L'idée est d'utiliser ces variables dans le if, au lieu de :
if (dr[0].ToString() == row.Cells[15].Value.ToString())

Mettre :
if (a.Equals(b))
1
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
30 mai 2014 à 17:46
Salut,

lorsque tu exécute ce code en débug, l'exception est levée à quelle ligne?

Aussi, un seul objet OracleCommand devrait suffire, tu n'as qu'à remplacer la valeur du CommandText. Ajuste ton code pour fermer les DataReader et la connexion à la BD lorsqu'ils ne sont plus utilisés.
0
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014
30 mai 2014 à 18:57
d'acc je vais les corriger merciii,

l'erreur s'affiche ds cette ligne
if (dr[0].ToString() == row.Cells[15].Value.ToString())

si non dans cette ligne
cmd8.CommandType = CommandType.Text;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014
30 mai 2014 à 20:03
Comment stocker des donnees dans des variables pour eviter l'utilisation de plusieurs datareader ? , est ce que vous pouvez me donner un exemple .
merci
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
30 mai 2014 à 20:10
Voilà!

var a = dr[0].ToString();
var b = row.Cells[15].Value.ToString();
0
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014
30 mai 2014 à 20:17
c juste comme ça ?

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{

string connstring = "User Id=sonedee;Password=sonedee;Data Source=xe;";

OracleConnection conn = new OracleConnection(connstring);


OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
conn.Open();

string adrId=row.Cells[1].Value.ToString();
string cp = row.Cells[14].Value.ToString();
string localite = row.Cells[15].Value.ToString();
string delegation = row.Cells[16].Value.ToString();
string gouvernorat = row.Cells[17].Value.ToString();

if (Convert.ToBoolean(row.Cells[0].Value) == true)
{

if (!(row.Cells[15].ToString() == ""))
{

cmd.CommandText = "select distinct loc_nom,loc_matricule from s_localite";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
if (dr[0].ToString() == row.Cells[15].Value.ToString())
{
cmd.CommandText= "update s_adresse set loc_matricule=" + dr[1] + " where adr_id='" + adrId +"'";
cmd.CommandType=CommandType.Text;
cmd.ExecuteNonQuery();

}
}
else
{
conn.Close();


cmd.CommandText= "insert into s_localite values (seq.nextval,'" + localite + "','')";

cmd.ExecuteNonQuery();

cmd.CommandText = "select * from s_delegation where deleg_libille_francais ='" + delegation + "'";
cmd.CommandType=CommandType.Text;
dr = cmd.ExecuteReader();

while (!(dr.HasRows))
{


cmd.CommandText = "insert into s_delegation values (seq.nextval,'" + delegation+ "','','" + cp + "','')";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();


cmd.CommandText = "select deleg_matricule from s_delegation where deleg_libille_francais='" + delegation + "' and deleg_adr_cpl ='" + cp + "'";
cmd.CommandType = CommandType.Text;
dr = cmd.ExecuteReader();

string a = dr[0].ToString();
while (dr.Read())
{


cmd.CommandText = "update s_localite set deleg_matricule='" + a + "' where loc_nom ='" + localite + "'";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

cmd.CommandText = "insert into s_gouvernorat values (seq.nextval,'" + gouvernorat + "','','') ";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

cmd.CommandText = "select gouv_matricule from s_gouvernorat where gouv_libille_francais='" + gouvernorat + "'";
cmd.CommandType = CommandType.Text;
dr = cmd.ExecuteReader();
if (dr.HasRows){
string b = dr[0].ToString();

cmd.CommandText = "update s_delegation set gouv_matricule='" + b + "' where deleg_matricule='" + a + "'";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
}

}

}

}
conn.Close();
}
}
0
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014
30 mai 2014 à 20:52
j'ai le meme erreur dans la meme ligne apres le changement voici mon code complet

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{

string connstring = "User Id=sonedee;Password=sonedee;Data Source=xe;";

OracleConnection conn = new OracleConnection(connstring);


OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
conn.Open();

string adrId=row.Cells[1].Value.ToString();
var cp = row.Cells[14].Value;
var localite =row.Cells[15].Value;
var delegation = row.Cells[16].Value;
var gouvernorat =row.Cells[17].Value;
MessageBox.Show("cp "+cp+"localite "+localite+"deleg "+delegation+"gouv"+gouvernorat);
if (Convert.ToBoolean(row.Cells[0].Value) == true)
{

if (!(localite == ""))
{

cmd.CommandText = "select distinct loc_nom,loc_matricule from s_localite";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
string strdr = dr.ToString();
if (strdr.Equals(localite))
{
cmd.CommandText= "update s_adresse set loc_matricule=" + dr[1] + " where adr_id='" + adrId +"'";
cmd.CommandType=CommandType.Text;
cmd.ExecuteNonQuery();

}
}
else
{
conn.Close();

cmd.Connection = conn;
conn.Open();

cmd.CommandText= "insert into s_localite values (seq.nextval,'" + localite + "','')";

cmd.ExecuteNonQuery();

cmd.CommandText = "select * from s_delegation where deleg_libille_francais ='" + delegation + "'";
cmd.CommandType=CommandType.Text;
dr = cmd.ExecuteReader();

while (!(dr.HasRows))
{


cmd.CommandText = "insert into s_delegation values (seq.nextval,'" + delegation+ "','','" + cp + "','')";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();


cmd.CommandText = "select deleg_matricule from s_delegation where deleg_libille_francais='" + delegation + "' and deleg_adr_cpl ='" + cp + "'";
cmd.CommandType = CommandType.Text;
dr = cmd.ExecuteReader();


while (dr.Read())
{
var a = dr[0];

cmd.CommandText = "update s_localite set deleg_matricule='" + a + "' where loc_nom ='" + localite + "'";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

cmd.CommandText = "insert into s_gouvernorat values (seq.nextval,'" + gouvernorat + "','','') ";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

cmd.CommandText = "select gouv_matricule from s_gouvernorat where gouv_libille_francais='" + gouvernorat + "'";
cmd.CommandType = CommandType.Text;
dr = cmd.ExecuteReader();
if (dr.HasRows){
//erreuuuuur var b = dr[0];

cmd.CommandText = "update s_delegation set gouv_matricule='" + b + "' where deleg_matricule='" + a + "'";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
}

}

}

}
conn.Close();
}
}
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
30 mai 2014 à 20:59
Je ne crois pas que dr.ToString() va te donner la valeur que tu cherches.

Pour le reste, utilise le debugger avec un break point sur ton if et valide les valeurs des 2 variables (strdr et localite). Si sa ne donne rien, envoi le stacktrace complet de l'erreur.
0
wsara5454 Messages postés 58 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 27 octobre 2014
1 juin 2014 à 14:27
j'ai changé dr.tostring() et les 2 variables sont correctes
voici le stacktrace complet

System.AccessViolationException was unhandled
HResult=-2147467261
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=Oracle.DataAccess
StackTrace:
at Oracle.DataAccess.Client.OpsDac.GetInd(IntPtr pOpsErrCtx, IntPtr pOpsDacCtx, OpoMetValCtx* pOpoMetValCtx, OpoDacValCtx* pOpoDacValCtx)
at Oracle.DataAccess.Client.OracleDataReader.IsDBNull(Int32 i)
at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
at PFEPerso.Form1.saveToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\Sony\Documents\Visual Studio 2010\Projects\PFEPerso\PFEPerso\Form1.cs:line 517
at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at PFEPerso.Program.Main() in c:\users\sony\documents\visual studio 2010\Projects\PFEPerso\PFEPerso\Program.cs:line 18
InnerException:
0
fredou30 Messages postés 46 Date d'inscription vendredi 30 septembre 2005 Statut Membre Dernière intervention 2 juin 2014 2
2 juin 2014 à 15:56
L'erreur provient donc de l'utilisation de la connexion à Oracle. Veuillez vérifiez que vous avez la dernière version du connecteur.

Autrement, vérifiez la documentation d'Oracle sur la manière d'utiliser le connecteur.
0