none
SMO et insertion de champ binaire (paramètre donc) RRS feed

  • 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

    jeudi 25 novembre 2010 10:27

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
    lundi 29 novembre 2010 15:53

Toutes les réponses

  • Le type de données binaire existe avec SMO. (DataType.Binary)

    Postez votre requête pour que l'on puisse vous aider.

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    jeudi 25 novembre 2010 11:00
    Modérateur
  • 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

    jeudi 25 novembre 2010 12:14
  • 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

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    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.

     

     


    Suivez MSDN sur Twitter 

    dimanche 28 novembre 2010 10:49
  • 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
    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/microsoft.sqlserver.management.common.connectionmanager.sqlconnectionobject(v=SQL.100).aspx

    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.
    jeudi 9 décembre 2010 21:25
  • 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
    vendredi 10 décembre 2010 08:57