-1
votes

Insertion d'octet () le long des chaînes latérales vers la base de données SQL

Voici donc l'instruction SQL prédéfinie qui est stockée dans le fichier DAO. Les valeurs provenaient d'une classe. La valeur d'image est une image convertie en un octet (). Cette classe est écrite dans vb.net. Je suis dans un nouvel emploi et dans mon précédent, j'ai utilisé Angular et le framework d'entité, alors écrivez des déclarations SQL est nouvelle pour moi. J'essaie de suivre des exemples existants des travailleurs de CO, mais ils n'ont jamais inséré d'images dans la base de données avant donc que je suis un peu seul. Oui, je sais que je pouvais simplement stocker les fichiers sur le serveur et enregistrer les chemins dans la base de données, mais pour une raison quelconque, mon équipe de réseau le souhaite stockée dans la base de données en tant que blobs. Donc, voici l'instruction SQL.

Operator '&' is not defined for types 'String' and 'Byte()'


7 commentaires

Vous ne devriez absolument pas construire votre code SQL comme ça. N'utilisez pas la concaténation de chaîne pour insérer des valeurs dans le code SQL. Utilisez toujours des paramètres. Les paramètres peuvent être utilisés pour n'importe quel type de données, si vous apprenez à le faire pour Strings , vous savez automatiquement comment procéder pour Byte Tableaux.


Vous devriez utiliser Paramètres SQL au lieu de concaténer une chaîne


L'utilisation des paramètres signifie également que vous n'avez pas besoin de cette méthode POSTHOPHES . Cela évite également les problèmes avec les dates de formatage et similaires.


Mais c'est la façon dont le device Lev le fait et c'est comme ça qu'il veut que cela soit fait. Existe-t-il un moyen d'ajouter des paramètres à la déclaration que j'ai ci-dessus? Désolé si c'est une question stupide, je suis nouveau pour écrire ces déclarations.


@jmcilhinney Avez-vous une sorte de doc, je peux suivre pour ajouter des paramètres? Est-il possible d'ajouter des paramètres aux valeurs que j'ai ci-dessus en utilisant la classe?


"C'est la façon dont le device devient" . Ensuite, j'ai bien peur que ce devoir devienne incompétent. En ce qui concerne les informations sur le sujet, vous pouvez facilement rechercher une recherche sur le Web. ici est ma propre prise.


Merci. Puis-je toujours utiliser les valeurs de ma classe? Je vais regarder dans ça. Le device de devise a été là 24 ans peut-être que c'est juste une ancienne méthode? J'apprécie les conseils.


3 Réponses :


0
votes

trop long et impliqué pour un commentaire. Vous avez l'extrait suivant dans votre code: xxx

c'est une erreur. Fname est une chaîne et doit être traitée exactement de la même manière que vous le faites avec MNAME. Il manque les délimiteurs de citation simples.

Plus généralement, cette approche repose sur la conversion de tous vos "champs" en littéraux pour les intégrer en tant que chaînes de votre relevé TSQL. La question devient donc comment "écrivez-vous" un littéral binaire dans TSQL. Vous feriez cela en générant une chaîne comme celle-ci: 0x69048AFDD010E. La documentation pour les constantes TSQL est ici . Sachant que le prochain problème est de savoir comment faire cela dans votre langage de développement - ce qui n'est pas quelque chose que je peux répondre. Ce semble prometteur.

Mais avant de descendre ce chemin, utilisez le paramétrage et vous ne devez jamais traiter de nouveau à ce jour.


1 commentaires

J'ajouterai que l'approche actuelle peut échouer en fonction de la taille de votre image.



1
votes

Utilisez toujours des paramètres pour éviter l'injection SQL, rendez votre instruction SQL plus facile à écrire et à lire, et assurez-vous que vous envoyez les datatypes corrects. Les paramètres permettront également des apostrophes. Utilisez la méthode .add code>. Voir http://www.dbdelta.com/addwithvalue-is-evil/ et https: // blogs .msmvps.com / jcoehoorn / Blog / 2014/05/12 / CAN-WE-STOP-UTILISATION-ADDWITHVALUE-Déjà / et un autre: https://dba.stackexchange.com/questions/195937/addwithvalue-performance- et-plan-cache-implications Voici un autre https://andrevdm.blogspot.com/2010/12/Parameté- QueriesDont-user.html

Dans le code ci-dessous, je devais deviner au sqldbtype code> et taille. Vérifiez votre base de données pour les informations correctes. P>

connexions et commandes utilise des ressources non gérées. Ils libèrent ces ressources dans leur méthode .Dispose de sorte que cette méthode doit être appelée. Utiliser ... Fin à l'aide de CODE> Les blocs prennent soin de la fermeture et de la mise à disposition d'objets même s'il y a une erreur. P>

J'ai supposé que pp était une instance d'une classe. J'ai donné à la classe la personne du nom. Corrigez ceci au nom de la classe réelle. P> xxx pré>

edit: p>

dans les anciennes versions de VB qui n'a pas pris en charge la chaîne multiligne code> Littéraux, vous pouvez utiliser un littéral XML à la place: P>

Dim sql = <sql>
            INSERT INTO AuthAccessID (
              FName,
              MName,
              LName,
              Suffix,
              Address,
              AddressExt,
              City,
              State,
              Zip,
              LawFirm,
              Picture,
              AddedDate,
              AddedBy)
              VALUES (
              @FName, 
              @MName, 
              @LName, 
              @Suffix,
              @Address,
              @AddressExt,
              @City,
              @State,
              @Zip,
              @LawFirm,
              @Picture, 
              @AddedDate,
              @AddedBy)
           </sql>

Using cn As New SqlConnection(ConStr),
      cmd As New SqlCommand(sql.Value, cn)


6 commentaires

Merci cela était parfait. Ma connexion à la base de données est en fait déclarée dans une zone différente. Dans le code de la page, cette instruction SQL sera appelée une fois que les données du formulaire sont attribuées à l'instance de la classe. Donc, je peux simplement laisser tomber la pièce de connexion et utiliser les paramètres toujours dans l'instruction lorsqu'il est passé à l'instance, non?


Aussi avec ce code, je reçois le message d'erreur BC30648: Les constantes de cordes doivent se terminer par une double citation. Ce qui n'a aucun sens puisqu'il finit par "


@Joebarrett, quelle version de VB utilisez-vous? Le code de Mary utilise une chaîne multiligne littéral mais ils n'ont été pris en charge que dans les dernières versions. Avant cela, vous pouvez utiliser un littéral XML pour éviter de concaténer plusieurs littéraux sur plusieurs lignes. Voir mon édition à la réponse pour un exemple de cela.


@Joebarrett était la double erreur de devis résolue par Modifier JMCILLHINEY? La version de Visual Studio avant 2015 ne prend pas en charge les chaînes multilignes, à l'exception de la méthode littérale XML.


@Joebarrett concernant la connexion. Il est en fait préférable que la connexion soit locale sur la méthode où elle est utilisée afin qu'elle puisse être fermée et disposée. La chaîne de connexion peut être déclarée ailleurs.


J'ai utilisé vs 2019. Je n'ai pas encore besoin d'essayer la solution de JM pour l'instant.



0
votes

Je viens d'un fond de msaccess, donc je code tout à fait la même chose que j'ai fait dans VBA ou maintenant avec vb.net

ici le code que j'utiliserais: p> xxx pré>

Et j'ai deux routines d'assistance. Le premier obtient une propriété de classe par une valeur de "chaîne". P>

Depuis la chance, vous avez des noms de champs et les membres de la classe sont les mêmes! P>

Public Function MyrstEdit(strSQL As String, ByRef oReader As SqlDataAdapter) As DataTable

    Dim mycon As New SqlConnection(strCon)
    oReader = New SqlDataAdapter(strSQL, mycon)
    Dim rstData As New DataTable
    Dim cmdBuilder = New SqlCommandBuilder(oReader)
    Try
        oReader.Fill(rstData)
        oReader.AcceptChangesDuringUpdate = True
    Catch
    End Try
    Return rstData

End Function


0 commentaires