Insérer un tableau d'octets dans SQL Server à partir de C# et comment faire pour le récupérer
J'essaie d'insérer ce tableau d'octets en une base de données SQL Server, le type de données de colonne est varbinary
et c'est mon code en C#
SqlParameter param = new SqlParameter("@buffer", SqlDbType.VarBinary, 8000);
param.Value = buffer;
string _query = "INSERT INTO [dbo].[Files] (FileID, Data, Length) VALUES ('" + uID + "','" + buffer + "','" + buffer.Length + "')";
using (SqlCommand comm = new SqlCommand(_query, conn))
{
comm.Parameters.Add(param);
try
{
conn.Open();
comm.ExecuteNonQuery();
}
catch (SqlException ex)
{
return Request.CreateResponse(HttpStatusCode.OK, "Something went wrong : " + ex.Message);
}
finally
{
conn.Close();
}
}
J'ai aussi essayé avec @buffer
à l'intérieur de la _query
chaîne, au lieu de tampon mais je reçois l'erreur :
La conversion de type varchar varbinary n'est pas permis d'utiliser la commande CONVERT pour exécuter cette requête
et j'ai utilisé Convert
et il est enregistré avec succès, mais quand je le récupère, il récupère les 14 premiers octets seulement,
byte[] bytearr = (byte[])row["Data"];
J'ai cherché et rien trouvé. Pouvez-vous m'aider à stocker les octets et de la récupérer?
Quelle est la longueur de la colonne varbinary tel qu'il est configuré en SQL?
Pourquoi cette question, obtenir des -1?
Pouvez-vous utiliser une procédure stockée ou elle doit être ad hoc?
Ce code est vulnérable à des attaques par injection sql. C'est pratiquement la mendicité pour avoir piraté.
Pourquoi cette question, obtenir des -1?
Pouvez-vous utiliser une procédure stockée ou elle doit être ad hoc?
Ce code est vulnérable à des attaques par injection sql. C'est pratiquement la mendicité pour avoir piraté.
OriginalL'auteur Ibraheem Al-Saady | 2014-03-31
Vous devez vous connecter pour publier un commentaire.
Vous envoyer vos valeurs littérales dans votre requête SQL. C'est une mauvaise idée, mais d'abord le problème avec votre requête:
Varbinary littérale dans SQL Server est pas une chaîne de caractères (entre guillemets), mais un très grand nombre hexadécimal, en regardant quelque chose comme cet exemple:
SET @binary = 0x1145A5B9C98
.En passant, je trouve étrange que vous joignez à votre ID et votre Longueur entre guillemets. Je suppose qu'ils sont entiers, ils doivent l'être sans les guillemets:
SET @i = 2
. Il peut continuer à travailler dans votre cas, parce que la chaîne va être converti en entier en SQL Serveur à la volée. Il est juste confus et moins efficace.Maintenant, veuillez jamais de faire des requêtes SQL en concaténant les littéraux comme ça. Utilisation des paramètres SQL à la place. Quelque chose comme ça:
Si vous voulez faire encore plus simple, regardez dans certains helper. Je recommande Dapper.
Enfin, je note que vous stockez à la fois un varbinary et sa longueur. Ce n'est pas obligatoire, vous pouvez toujours obtenir la longueur d'une varbinary stockées dans SQL Server comme ceci:
SELECT LEN(Data) FROM Files
OriginalL'auteur jods
C'est la façon dont je le fais à partir d'un de mes projets. Également ajouter à l'un des commentaires que quelqu'un a fait au sujet des attaques par injection sql, il est de bonne pratique de ne pas la concaténation de chaînes de caractères ensemble pour former une chaîne sql. Au lieu d'utiliser les paramètres de commande comme je le fais ci-dessous avec le nom du param. Cela empêche la plupart des types d'attaques par injection sql.
De chargement:
De l'épargne: les
OriginalL'auteur PCG