Lier un fichier

kaoutar90 Messages postés 40 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 8 octobre 2011 - 19 août 2010 à 12:24
kaoutar90 Messages postés 40 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 8 octobre 2011 - 23 août 2010 à 11:54
Bonjour !!
SVP j'aimerais attacher un fichier à une base de données mais je sais pas comment faire pourriez vous m'aidez ??
(j'utilise vb.net 2008 et sql server management studio 2005 express)
Merci

12 réponses

gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
19 août 2010 à 12:28
Bonjour,

pas compris
attacher un fichier à une base de données


soit plus précis s'il te plait

a+
google est mon ami quand tu cherches quelque chose demande lui clairement
0
kaoutar90 Messages postés 40 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 8 octobre 2011
19 août 2010 à 12:54
Ok je vais etre claire je veux attacher un fichier l'enregistré par exemple pour mon sujet de stage je fais la gestion des projets alors quand j'enregistre un projet il faut que je l'attche le fichier associé à ce projet j'espere que j'ai bien expliqué
Merci d'avance !!
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
19 août 2010 à 13:44
Bonjour,

Sous sql server 2005, les champs de type "image" vous permette de stoker des fichiers jusqu'à 2Go.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
19 août 2010 à 16:57
Bonjour,

c'est lourd , plus simple enregistrer le ficheir dans un path relatif à ton appli et n'enregistrer que le path dans la db

a+
google est mon ami quand tu cherches quelque chose demande lui clairement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
19 août 2010 à 22:27
Je ne vois pas en quoi faire un insert dans une table est plus complexe que de gérer un dossier pour lequel il faudra surement gérer des droits d'accès, sans compter qu'il faudra controler si le fichier existe bien lorsqu'on voudra y accéder.

Au final un fichier n'est rien de plus qu'une suite d'octets, tout comme une String ou un Integer. Certe les tailles ne sont pas les mêmes, mais la manipulation n'en reste pas moins identique.

Maintenant, chacun son point de vue.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
20 août 2010 à 01:51
Non, en fait je pense qu'il parle bien d'attachement de base de données.

L'attachement permet à n'importe quel client de se connecter à une base via SQL Serveur sans en connaitre son chemin d'accès.
Il permet de rallier une base au serveur lui même. Ainsi, on peut en spécifier simplement le nom via l'attribut 'Intitial Catalog' de la chaine de connexion.

L'attachement peut se faire durant la chaine de connexion, mais aussi directement via le transact SQL donc via SSMS.

Pour attacher une base via SSMS il faut se connecter au serveur voulu dans un premier temps. Puis dans l'explorateur d'objets, faire un clique droit sur le nœud 'Bases de données' et choisir 'Joindre' dans le menu. En suite il suffit de préciser le chemin local de la base (fichier *.mdf), mais le fichier log devra être présent dans le même répertoire.

Un fois attaché, actualiser l'explorateur d'objets (F5), puis renommer la base maintenant visible dans le nœud, si nécessaire.

foliv57> Faux, l'image en elle même reste une suite d'octets mais la différence se situe dans le temps de localisation et de transfert de ces octets.

Lors ce que l'on stock une image sur le disque, on précise un chemin d'accès et c'est le système de fichier, qui retrouve ces octets et les renvois. Lors ce qu'ils sont stockés dans une base, la base cherche l'emplacement au sein du fichier, et demande au système de fichier, qui va aussi rechercher l'emplacement sur le disque, donc c'est moins optimisé.

De plus, plus une base comporte de données, plus celle-ci devient lente pour les requêtes, logiques.

Et 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.

Voila, @+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 août 2010 à 14:46
Et 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.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
20 août 2010 à 15:39
Pas forcement, il est tout a fait possible de faire une extraction et une insertion par packets dans un champ de type image.


Ah bon ? Bah tu vois, on en apprend tous les jours ^^

Via ADO.Net ou peut fragmenter l'envoi ou la réception des données ?
Ou peut être que cela se paramètre coté serveur non ?

En tous cas je veux bien que tu post la méthode (si c'est pas trop long), ça pourrait toujours servir.

@+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 août 2010 à 18:57
Pas de souci, je vais préparer un petit exemple.

Par contre je vais plutot poster un code plutot que de continuer sur ce post qui, malgré 3 solutions proposées, n'a pas l'air d'interreser son créateur .

N'ayant pas parti pris pour l'une ou l'autre des méthodes (que je choisie plutot en fonction de mon humeur au moment ou on me demande de faire ce genre de chose), la question a égayé ma curiosité.

Je vais donc faire deux appliction+bdd, une basée sur le stockage par filesys et l'autre dans le champ image d'une base sqlserver 2005.

Le but étant que chacune devra stocker, extraire, puis supprimer une quantité importante de fichiers(4Go max malheureusement car je n'ai qu'une version express de sqlserver sous la main), et de comparer la difficulté de mise en oeuvre et la différence de performance (entre guillemets bien entendu car beaucoup de facteurs entre en compte).

N'ayant pas trop de temps tout de suite, je place quand même le principe de base de gestion par packets d'un champ image. Par contre c'est du brut de chez brut et pas du tout optimisé, donc désolé pour le manque d'explication pour le moment

Insertion par packets :
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


Extraction par parquets:
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


Par contre il est évidant que dans ce cas je rejoins gillardg sur la lourdeur.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
20 août 2010 à 19:27
@foliv57> Merci pour le partage, c'est très interessant !

Je n'aurais pas pensé employer cette méthode du tout, c'est très recherché, chapeau

Je t'avoue que j'ai mis quelques minutes à comprendre, c'est la récupération du pointeur et l'update qui suit qui m'on perturbés. De plus j'suis pas très calé en transact-SQL j'ai un super bouquin depuis 8 mois que je n'ai toujours
pas ouvert ^^

Un grand merci en tous cas cette apprentissage me servira certainement, à moi et surement à d'autres. Dommage que le titre ne corresponde pas. Par contre tu pourrais mettre cette astuce sur Codyx, ou voir même en faire un tuto (quoi que un peu cout, mais en détaillant un peu plus).

@+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 août 2010 à 21:08
Il y a pas de quoi, ce site m'a sauvé la mise plus d'une fois. Ce n'est qu'un juste retour des choses.

C'est vrai que la methode fait bien mal aux cheveux à la première lecture. Mais je te rassure, elle n'est pas spécifiquement de moi, c'est une technique qu'il faut métriser pour l'obtention de la certif MCTS sur le framework 2.0. D'ailleur ca va rappeler des souvenirs aux gens qui on passé l'examun s'ils lisent ce post .

Comme promis, je mettrai ca au propre et plus détaillé dès que possible.
0
kaoutar90 Messages postés 40 Date d'inscription vendredi 14 novembre 2008 Statut Membre Dernière intervention 8 octobre 2011
23 août 2010 à 11:54
MErcii bcccppp pour l'explication
à foliv57> c'est que je me pas interessé mais seulement j'avais un problèmes de connexion c'est pour celaa j'ai pas pu voir les réponses et MERCI BCCCP pour ton aide !!
0
Rejoignez-nous