2009-06-30 7 views
59

J'ai un tableau d'octets mis en évidence ci-dessous, comment l'insérer dans une colonne Varbinary de base de données SQL Server?Comment insérer un octet [] dans une colonne VARBINARY SQL Server

byte[] arraytoinsert = new byte[10]{0,1,2,3,4,5,6,7,8,9}; 

string sql = 
    string.format 
    (
    "INSERT INTO mssqltable (varbinarycolumn) VALUES ({0});",WHATTODOHERE 
    ); 

Merci d'avance les gars!

Répondre

69

Ma solution serait d'utiliser une requête paramétrés, comme les objets de connectivité prendre soin de formatage correctement les données (y compris en assurant le bon type de données, et l'échappement des caractères « dangereux » le cas échéant):

// Assuming "conn" is an open SqlConnection 
using(SqlCommand cmd = new SqlCommand("INSERT INTO mssqltable(varbinarycolumn) VALUES (@binaryValue)", conn)) 
{ 
    // Replace 8000, below, with the correct size of the field 
    cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, 8000).Value = arraytoinsert; 
    cmd.ExecuteNonQuery(); 
} 

Edit: Ajout de l'instruction "using" d'encapsulation comme suggéré par John Saunders pour disposer correctement de la SqlCommand après qu'elle soit terminée avec

+3

Jason, pourriez-vous mettre une instruction using autour de "SqlCommand cmd = new ..."? Sinon, je me sentirais obligé de rétrograder, et je détesterais ça. –

+11

Si la colonne est VARBINARY (MAX), remplacez 8000 par -1, voir http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/e61f0616-0866-4f3f-aeba-6a76e144e169/ –

74

Essayez ceci:

"0x" + BitConverter.ToString(arraytoinsert).Replace("-", "") 

Bien que vous devriez vraiment utiliser une requête paramétrées plutôt que la concaténation de chaîne bien sûr ...

+0

Salut David, merci pour la réponse, pourquoi devrais-je utiliser une requête paramétrée? – divinci

+4

Minimale ici, mais les requêtes paramétrées peuvent être compilées puis mises en cache, ce qui économise le coût de compilation avec chaque requête suivante. Ils protègent également contre les attaques par injection SQL. Enfin, vous pouvez définir directement la valeur du paramètre sur le tableau d'octets et éviter les trucs de BitConverter ... –

+0

Ne pensez pas que travailler avec VARBINARIES comme ceci est une bonne idée en général. SQL Server permet de très gros VARBINARIES (était-ce 2 Gb?) Et cela ne serait probablement pas très bien adapté à cette méthode. Je ne peux pas évaluer si ce serait un problème dans ce cas particulier, donc je laisse le -1 pour le moment. – peSHIr

1

Aucun problème si tous les tableaux que vous allez utiliser dans ce scénario sont petits comme dans votre exemple . Si vous utilisez ceci pour des grosses tâches (par exemple stocker de gros fichiers binaires de taille Mbs ou même Gbs dans un VARBINARY) alors vous feriez mieux d'utiliser un support spécifique dans SQL Server pour lire/écrire des sous-sections de de tels gros blobs. Des choses comme READTEXT et UPDATETEXT, ou dans les versions actuelles de SQL Server SUBSTRING. Pour plus d'informations et d'exemples, voir soit mon article de 2006 dans le .NET Magazine ("BLOB + Stream = BlobStream", en néerlandais, avec un code source complet), soit une traduction en anglais et la généralisation de ce on CodeProject par Peter de Jonghe. Les deux sont liés à my weblog.

0

vérifier ce lien d'image pour toutes les étapes https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

STEP1: J'ai créé un champ de type varbinary dans le tableau

STEP2: J'ai créé une procédure stockée pour accepter un paramètre de type sql_variant

ÉTAPE3: Dans ma page frontale asp.net, j'ai créé un paramètre de source de données SQL du type d'objet

 <tr> 
     <td> 
      UPLOAD DOCUMENT</td> 
     <td> 
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="btnUpload" runat="server" Text="Upload" /> 
      <asp:SqlDataSource ID="sqldsFileUploadConn" runat="server" 
       ConnectionString="<%$ ConnectionStrings: %>" 
       InsertCommand="ph_SaveDocument"  
       InsertCommandType="StoredProcedure"> 
       <InsertParameters> 
        <asp:Parameter Name="DocBinaryForm" Type="Object" /> 
       </InsertParameters> 

      </asp:SqlDataSource> 
     </td> 
     <td> 
      &nbsp;</td> 
    </tr> 

ÉTAPE 4: Dans mon code derrière, je tente de télécharger les FileBytes de FileUpload Commande par cet appel de procédure stockée à l'aide d'une commande de source de données SQL

 Dim filebytes As Object 
     filebytes = FileUpload1.FileBytes() 
     sqldsFileUploadConn.InsertParameters("DocBinaryForm").DefaultValue = filebytes.ToString 
     Dim uploadstatus As Int16 = sqldsFileUploadConn.Insert() 

       ' ... code continues ... ' 
0

Vous pouvez faire quelque chose comme ça, solution très simple et efficace: Ce que j'ai fait était en fait utiliser un paramètre à la place de l'espace réservé de base, créer un objet SqlParameter et utiliser une autre méthode d'exécution existante. Par exemple dans votre scénario:

string sql = "INSERT INTO mssqltable (varbinarycolumn) VALUES (@img)"; 
SqlParameter param = new SqlParameter("img", arraytoinsert); //where img is your parameter name in the query 
ExecuteStoreCommand(sql, param); 

Cela devrait fonctionner comme un charme, à condition que vous ayez une connexion sql ouverte établie.

Questions connexes