stocker l'image dans la base de données en utilisant winforms

c# dapper sql-server winforms

Question

Je veux enregistrer l'image dans SqlServer en utilisant les winforms c # et dapper micro orm.

Photo champ Photo intérieur de db est de type VARBINARY(MAX)

Entité Inside Book J'ai une propriété Photo de type byte [].

public Book 
{
   ... 
   public byte[] Photo { get; set; }
}

Inside winforms window j'ai

  OpenFileDialog open = new OpenFileDialog() { Filter = "Image Files(*.jpeg;*.bmp;*.png;*.jpg)|*.jpeg;*.bmp;*.png;*.jpg" };
   if (open.ShowDialog() == DialogResult.OK)
   {
       txtPhoto.Text = open.FileName;
   }

   string image = txtPhoto.Text;
   Bitmap bmp = new Bitmap(image);
   FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
   byte[] bimage = new byte[fs.Length];
   fs.Read(bimage, 0, Convert.ToInt32(fs.Length));
   fs.Close();

   byte[] Photo = bimage;

// à l'intérieur de mon dépôt, j'ai une erreur lors de l'enregistrement de l'objet à la ligne Photo = @Photo

var sql = "UPDATE Book " +
          "SET Title = @Title, " +
          "    Language = @Language, " +
          ....
          "    Photo = @Photo" +
          "WHERE Id = @Id";

          this.db.Execute(sql, book); // error occures
          return book;

Erreur est

Une première exception de type "System.Data.SqlClient.SqlException" s'est produite dans System.Data.dll

Informations supplémentaires: Syntaxe incorrecte près de 'Photo'.

Est-ce que je manque quelque chose?

Merci

Réponse acceptée

Vous manquez des espaces avant le mot clé WHERE :

      "    Photo = @Photo" + // no space at the end here
      "WHERE Id = @Id";      // and no space before WHERE here

Aussi, je vous suggère d'utiliser une chaîne multiligne (ie littéral littéral textuel ) pour le texte de la requête SQL (ce qui rend la requête plus lisible):

var sql = @"UPDATE Book 
            SET Title = @Title, 
                Language = @Language, 
                Photo = @Photo
            WHERE Id = @Id";

Et encore une chose - il est préférable d’envelopper l’utilisation de Stream en using block (pour libérer le handle de fichier en cas d’exception):

byte[] photo;
using(var stream = File.OpenRead(txtPhoto.Text)
{
    photo = new byte[stream.Length];
    stream.Read(photo, 0, photo.Length);
}

// db query with dapper is OK



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi