Creation ou insertion dans une base de données [Résolu]

Signaler
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
22 juin 2011
-
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
22 juin 2011
-
salut à tous

Je traite dans mon application des fichiers .asc très lourd dont j'extrais les données et veux les insérer dans une base de données sql server.

A la fin de mon traitement je fais une requète avec un streamwriter de la façon suivante :

[b] sqlquery = "INSERT INTO " + NomTable + "(LADATE, SBS_NAME, SYMBOLIC_NAME, " + tab[1] + ") VALUES ( '" + ChampsDate + "','" + ChampsNomBSC + "','" +
ValSymb_Name + "'," + valeurs.Substring(1, valeurs.Length - 1) + ")";
Execute(sqlquery, sw);/b


et voici la methode qui permet l'execution de cette instruction:


private void Execute(string myQuery, StreamWriter sw)
{
try
{
SqlCommand myCommand = new SqlCommand(myQuery);
myCommand.Connection = connection;
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();

}
catch (SqlException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
//throw;
sw.WriteLine(myQuery);

}

voilà ma chaine de connexion : SqlConnection connection = new SqlConnection(@"Data Source=PC-DE-PIERREESP;Initial Catalog= ScanRadio;Integrated Security=SSPI");

Mais, lorsque j'execute le code, on me dit :
- soit: la connexion est dejà ouverte en soulignant myCommand.Connection.Open();.
- soit, lorsque j'enlève cette partie, on me dit que ExecuteNonQuery nécessite une connexion ouverte ...
- soit il manque une référence à une instance d'objet


De l'aide, car je ne sais pas où se trouve l'erreur

Alors, je ne sais

4 réponses

Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
22 juin 2010
1
Essaye un peu avec une méthode execute comme celle ci.

Un petit truc qui manque souvent, c'est de fermer la connection, et l'endroit le plus approprié pour le faire, c'est souvent dans le bloc finally.


private void Execute(string myQuery, StreamWriter sw)
{
try
{
SqlCommand myCommand = new SqlCommand(myQuery);
myCommand.Connection = connection;

if(connection.state != connectionstate.open)
{
myCommand.Connection.Open();
}

myCommand.ExecuteNonQuery();

}
catch (SqlException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
//throw;
sw.WriteLine(myQuery);
}
finally
{
connection.Close();
}
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
22 juin 2011

Je précise que je veux utiliser une requète paramétrée,, mais je ne sais pas comment m'y prendre pour cette requète là :

voici ce que j'ai fais, mais pour la suite , i don't know ....

voici la nouvelle requête : sqlquery = "INSERT INTO @NameTable (LADATE, SBS_NAME, SYMBOLIC_NAME, @tabb1) VALUES ( @DateCh, @BSCName, @ValSymbolic, @Val)";


private void Execute(string myQuery, StreamWriter sw)
{
try
{
SqlConnection connection = new SqlConnection(@"Data Source=PC-DE-PIERREESP;Initial Catalog= ScanRadio;Integrated Security=SSPI");

SqlCommand myCommand = new SqlCommand(myQuery);
myCommand.Connection = connection;
myCommand.CommandType = System.Data.CommandType.Text;
myCommand.CommandText = myQuery;

SqlParameter param1 = new SqlParameter("@NameTable", SqlDbType.VarChar);
SqlParameter param2 = new SqlParameter("@tabb1", SqlDbType.VarChar);
SqlParameter param3 = new SqlParameter("@DateCh", SqlDbType.VarChar);
SqlParameter param4 = new SqlParameter("@BSCName", SqlDbType.VarChar);
SqlParameter param5 = new SqlParameter("@ValSymbolic", SqlDbType.VarChar);
SqlParameter param6 = new SqlParameter("@Val", SqlDbType.VarChar);

param1.Value = ...
param2.Value = ...
param3.Value = ...
param4.Value = ...
param5.Value = ...
param6.Value = ...

myQuery.Parameters.Add(param1);
myQuery.Parameters.Add(param2);
myQuery.Parameters.Add(param3);
myQuery.Parameters.Add(param4);
myQuery.Parameters.Add(param5);
myQuery.Parameters.Add(param6);

sw.WriteLine(myQuery);

}
catch (SqlException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
22 juin 2011

La propriété Value de mes paramètres est censée prendre le contenu de variables string déjà déclarées et définies dans mon programme. Ce sont :

- NomTable
- tab[1]
- ChampsDate
- ChampsNomBSC
- ValSymb_Name
- valeurs.Substring(1, valeurs.Length - 1)


Merci pour votre aide chaleureuse !!
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
22 juin 2011

Merci Psych0 !

Pour l'instant, les choses fonctionnent bien ! la tâche de traitement a pu démarrer !
Mais, ma surprise est qu'elle a été interrompue avec un message purement technique que j'arrive pas encore à déchiffrer :

<< LE CLR N'A PAS PU EFFECTUER DE TRANSITION DU CONTEXTE COM 0x16d958 AU CONTEXTE COM 0x16dac8 pendant 60 seconde. LE THREAD QUI POSSEDE LE CONTEXTE/CLOISONNEMENT DE DESTINATION EST
PROBABLEMENT EN TRAIN D'ATTENDRE OU DE TRAITER UNE OPERATION TRES LONGUE SANS POMPAGE DES MESSAGES WINDOWS. CETTE SITUATION A GENERALEMENT DES EFFETS NEGATIFS SUR LES PERFORMANCES ET PEUT PARFOIS ENTRAINER LE BLOCAGE DE L'APPLICATION OU UNE UTILISATION ININTERROMPUE DE LA MEMOIRE. POUR EVITER CE PROBLEME, TOUS LES THREADS STA (Single Thread Apartment) DOIVENT UTILISER DES PRIMITIVES D'ATTENTE DE POMPAGE (PAR EXEMPLE COWAITFORMULTIPLEHANDLES) ET POMPER DE MANIERE REGULIERE LES MESSAGES LORS DES OPERATIONS QUI SONT LONGUES A S'EXECUTER >> fin de citation !

Une interprêtation de votre part serait bien !!

Merci