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

Messages postés
79
Date d'inscription
samedi 12 avril 2008
Dernière intervention
22 juin 2011
- - Dernière réponse : soupiste
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Dernière intervention
22 juin 2011
- 6 oct. 2009 à 16:42
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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Dernière intervention
22 juin 2010
3
Merci
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();
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Psych0
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Dernière intervention
22 juin 2011
0
Merci
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());
}
Commenter la réponse de soupiste
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Dernière intervention
22 juin 2011
0
Merci
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 !!
Commenter la réponse de soupiste
Messages postés
79
Date d'inscription
samedi 12 avril 2008
Dernière intervention
22 juin 2011
0
Merci
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
Commenter la réponse de soupiste

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.