Meilleur auteur de réponses
SMO et insertion de champ binaire (paramètre donc)

Question
-
Bonjour
J'ai une requête du type INSERT INTO adTable (adFieldBinaire) VALUES (@adBinaire) qui se passe très bien si j'effectue cela en CSharp à l'aide du namespace System.Data en ajoutant un paramètre de type SqlParameter mais je n'arrive pas à faire la même chose en SMO pur.
Pour exécuter ma requête en SMO pur, j'utilise la fonction ExecuteNonQuery de l'objet ServerConnection et j'arrive à insérer des valeurs. Cependant dès que j'arrive à une requête qui possède un champ binaire, cela ne fonctionne pas car je n'ai pas déclaré l'équivalence de la variable @adBinaire dans un paramètres SMO.
Cela est-il possible (Je suppose et surtout j'espère que oui) ? et si oui quel est l'objet qui me permettrait d'ajouter un paramètre et d'exécuter ma requête avec ce paramètre ?
Merci
Réponses
-
Bonjour
Alors effectivement, il faut convertir la variable byte[] en string cependant l'utilisation de BitConverter.ToString(byValeurToInsert).Replace("-","") ne fonctionne pas. J'arrive bien à insérer une valeur binaire dans ma base cependant elle ne correspond pas à la valeur du tableau de byte que j'ai converti
Pour que cela fonctionne, il faut parcourir chaque octet du tableau et effectuer un GetString d'un objet Encoding pour former une chaine totale représentant le tableau.
A partir de ce moment là, on peut insérer le tableau binaire à l'aide de la séquence SQL suivante
INSERT INTO Test (adBinaire) VALUES (CONVERT (VARBINARY(MAX), 'strChaine', 1))Donc pour moi c'est résolu
Encore merci pour votre aide
Seb- Marqué comme réponse Seb4 lundi 29 novembre 2010 15:53
Toutes les réponses
-
-
Je sais que le type binaire existe, je dois d'ailleurs l'utiliser lors de la déclaration de mon paramètre mais je ne sais pas comment déclarer ce paramètre. Voici un bon de code pour expliquer le problème.
bool bError = false; ServerConnection ServerToConnect = null; try { //m_Connection est correcte et ouverte ServerToConnect = new ServerConnection((SqlConnection)m_Connection); Server SqlServer = new Server(ServerToConnect); Microsoft.SqlServer.Management.Smo.Database db = null; string strDatabaseName = "Essai"; if(!SqlServer.Databases.Contains(strDatabaseName)) { CreateDatabase(strDatabaseName); SqlServer.Databases.Refresh(); } db = SqlServer.Databases[strDatabaseName]; //Début d'une transaction ServerToConnect.BeginTransaction(); string strTableName = "Toto"; Table TableInSQL = new Table(db, strTableName); //Création de la table TableInSQL.Create(); //Insertion de valeur OK string strRequete = "INSERT INTO " + strTableName + " (id, value) VALUES (1, 'Essai')"; int iRetour = ServerToConnect.ExecuteNonQuery(strRequete); if (iRetour == 0) bError = true; //Insertion qui pose problème byte[] byValeurToInsert = new byte[2]; byValeurToInsert[0] = 0x1; byValeurToInsert[1] = 0x2; //ICI JE DOIS DECLARER UN PARAMETRE POUR ASSOCIER LA VARIABLE SCALAIRE @adBinaire AVEC MON TABLEAU DE BYTE //Je ne sais pas comment ajouter un paramètre en SMO donc la variable scalaire @adBinaire n'existe pas lors de l'ExecuteNonQuery //Et je ne peux donc pas insérer mon tableau correctement string strRequete = "INSERT INTO " + strTableName + " (adBinaire) VALUES (@adBinaire)"; iRetour = ServerToConnect.ExecuteNonQuery(strRequete); if (iRetour == 0) bError = true; } catch(Exception ex) { //Validation ou annulation de la transaction if (ServerToConnect != null) { if (!bError) ServerToConnect.CommitTransaction(); else ServerToConnect.RollBackTransaction(); } }
Seb -
Bonjour,
Vous devez convertir la variable byte[] dans une variable de type string et l’insérer dans le texte de la requête :
BitConverter.ToString(byValeurToInsert).Replace("-","")
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Bonjour
Alors effectivement, il faut convertir la variable byte[] en string cependant l'utilisation de BitConverter.ToString(byValeurToInsert).Replace("-","") ne fonctionne pas. J'arrive bien à insérer une valeur binaire dans ma base cependant elle ne correspond pas à la valeur du tableau de byte que j'ai converti
Pour que cela fonctionne, il faut parcourir chaque octet du tableau et effectuer un GetString d'un objet Encoding pour former une chaine totale représentant le tableau.
A partir de ce moment là, on peut insérer le tableau binaire à l'aide de la séquence SQL suivante
INSERT INTO Test (adBinaire) VALUES (CONVERT (VARBINARY(MAX), 'strChaine', 1))Donc pour moi c'est résolu
Encore merci pour votre aide
Seb- Marqué comme réponse Seb4 lundi 29 novembre 2010 15:53
-
Bonjour,
Pourquoi ne pas utiliser la propriété SqlConnectionObject de votre ServerConnection qui vous renverra un objet du type SqlConnection ?
Si vous etes un habitué du namespace SqlClient, vous pourrez utiliser SqlCommand et autres classes qui permettent de faire une insertion dans une table
http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
http://msdn.microsoft.com/en-us/library/cc716729.aspx
Bonne journée
PS : je suis très surpris par la présence d'une variable du type varbinary(MAX). En général, ce n'est necessaire qu'en remplacement du type image déprécié depuis SQL Server 2008
Mark Post as helpful if it provides any help.Otherwise,leave it as it is. -
Bonjour
Mon problème est que je crée les tables à l'aide de SMO. Pour ce faire, j'ai débuté une transaction sur l'objet ServerConnection
Dans ce cas préci, je ne pouvais pas utiliser de SqlCommand car la transaction active empêchait l'ajout de valeur et je ne pouvais pas réutiliser la transaction de l'objet ServerConnection.
J'ai donc dans un premier temps effectué un ajout avec la réponse que je vous donnais mais ça ne me plaisait pas trop. Du coup, j'ai supprimé les transactions et j'ai fait un système de Backup Restore ce qui permet de faire une insertion à l'aide d'une commande SqlCommand et si j'ai la moindre erreur lors de la mise à jour de la base de donnée, j'effectue un Restore.Bonne journée
PS: J'ai pris une variable de type varbinary(MAX) car le champ de la base de donnée existante est de ce type (SQL Server 2005)
Seb