attacher un fichier à une base de données
google est mon ami quand tu cherches quelque chose demande lui clairement
google est mon ami quand tu cherches quelque chose demande lui clairement
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionEt une dernière chose, les octets sont renvoyés en masse par la requêtes, donc il y a un risque de blocage durant l'opération synchrone, tandis que via le système de fichier c'est plus souple les Stream permettent la décomposition par paquets.
Pas forcement, il est tout a fait possible de faire une extraction et une insertion par packets dans un champ de type image.
Dim fs As FileStream = Nothing Dim br As BinaryReader = Nothing Dim id As SqlParameter = Nothing Dim Output_pointer As SqlParameter = Nothing Dim Input_pointer As SqlParameter = Nothing Dim offset As SqlParameter = Nothing Dim bytes As SqlParameter = Nothing Dim bufferLength As Integer = 512 'buffer de 512 octets Me.ProgressBar.Value = 0 Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnString").ConnectionString) 'Ouverture de la connection connection.Open() 'Ouverture du filestream et récupération des informations du fichier fs = New FileStream(Me.Txt_SourceFileChm.Text, FileMode.Open, FileAccess.Read) br = New BinaryReader(fs) Dim fileLength As Int64 = fs.Length Dim fileName As String = My.Computer.FileSystem.GetFileInfo(Me.Txt_SourceFileChm.Text).Name Me.ProgressBar.Maximum = (fileLength \ 512) 'Création et exécution d'une requête qui ajoute une nouvelle ligne à la table LOB 'et renvoi l'id de la ligne ajouté ansi qu'un pointeur vers l'emplacement mémoire 'de l'image à sauvegarder dans la base Using commandAddNew As New SqlCommand("INSERT INTO dbo.LOB " _ & "(Name, Taille, Photo) " _ & "VALUES (@Name, @Taille, 0x0); " _ & "SELECT @Id = SCOPE_IDENTITY(); " _ & "SELECT @Pointer = TEXTPTR(Photo) " _ & "FROM dbo.LOB WHERE idImage = @Id", connection) commandAddNew.CommandType = CommandType.Text 'Ajout des paramètres d'entrés commandAddNew.Parameters.Add("@Name", SqlDbType.VarChar, 500).Value = fileName commandAddNew.Parameters.Add("@Taille", SqlDbType.BigInt).Value = fileLength 'Ajout des paramètres de sorties id = commandAddNew.Parameters.Add("@Id", SqlDbType.Int) Output_pointer = commandAddNew.Parameters.Add("@Pointer", SqlDbType.Binary, 16) id.Direction = ParameterDirection.Output Output_pointer.Direction = ParameterDirection.Output 'Exécution de la commande commandAddNew.ExecuteNonQuery() End Using 'Création d'une requête permetant de mettre à jour une partie d'un champ image Using commandUpdatePhoto As New SqlCommand("UPDATETEXT LOB.Photo @Pointer @Offset 0 @Bytes", connection) 'Ajout des paramètres d'entrés Input_pointer = commandUpdatePhoto.Parameters.Add("@Pointer", SqlDbType.Binary, 16) offset = commandUpdatePhoto.Parameters.Add("@Offset", SqlDbType.Int) bytes = commandUpdatePhoto.Parameters.Add("@Bytes", SqlDbType.Binary, bufferLength) 'Initialisation du pointeur Input_pointer.Value = Output_pointer.Value 'Initialisation de l'offset offset.Value = 0 'Déclaration et initialisation des variables typées pour le parcour Dim buffer() As Byte = br.ReadBytes(bufferLength) Dim offset_ctr As Integer = 0 While buffer.Length > 0 'Set la table d'octets qui va être envoyées bytes.Value = buffer 'Envoi de la table d'octets commandUpdatePhoto.ExecuteNonQuery() Me.ProgressBar.Increment(1) 'Incrémentation de l'offset offset_ctr += buffer.Length offset.Value = offset_ctr 'Continue la lecture du flux tant que le nombre d'octets lus est > 0 buffer = br.ReadBytes(bufferLength) End While End Using End Using
Dim ms As New MemoryStream() Dim fileLength As Int64 Dim fileName As String Dim bufferLength As Integer = 512 Dim buffer(bufferLength - 1) As Byte 'buffer de 512 octets Dim offset As Integer = 0 Dim bufferSize As Integer = 0 Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnString").ConnectionString) 'Ouverture de la connection connection.Open() 'Création et exécution d'une requête qui effectue le chargement des données Using command As New SqlCommand("SELECT Name, Taille, Photo FROM dbo.LOB WHERE idImage = @id", connection) command.Parameters.Add("@id", SqlDbType.Int).Value = CType(Me.Txt_id.Text, Integer) 'Récupération du résultat de la requête dans un datareader Using reader As SqlDataReader = command.ExecuteReader(CommandBehavior.SequentialAccess) 'Si l'image existe If reader.Read() Then Me.ProgressBar.Value = 0 fileName = reader.GetSqlString(0) fileLength = reader.GetSqlInt64(1) Me.ProgressBar.Maximum = (fileLength \ 512) bufferSize = reader.GetBytes(2, offset, buffer, 0, bufferLength) While bufferSize > 0 offset += bufferSize ms.Write(buffer, 0, bufferSize) bufferSize = reader.GetBytes(2, offset, buffer, 0, bufferLength) Me.ProgressBar.Increment(1) End While Me.Photo.Image = Image.FromStream(ms) Else MsgBox("Cette image n'existe pas") End If End Using End Using End Using