0
votes

Paramètres de commande

Comment corriger les paramètres d'envoi sur Query OLEDB CODE>?

MyCode est P>

DataTable dt = new DataTable();
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + tb_tablename.Text, conn))
{
    adapter.Fill(dt);
}

foreach (DataColumn column in dt.Columns)
{
    if (column.DataType == typeof(String))
    {
        if (column.ColumnName != "ID1" && column.ColumnName != "ID" && column.ColumnName != "Geometry" && column.ColumnName != "Geometry_SK")
        {
            string query = "UPDATE " + tb_tablename.Text.Trim() + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "], Chr(10), '');";

        using (OleDbCommand cmd = new OleDbCommand(query, conn))
        {
            cmd.ExecuteNonQuery();
        }
    }
}
}


8 commentaires

Le fournisseur OLE db rel = "NOFOOLS NOREFERRER"> LINK . L'espace réservé à la marque (?) Doit être utilisé.


Note latérale; Je pense que dans Ole, vous pouvez écrire @Namedparameters, mais ils ne fonctionnent pas comme des paramètres nommés - ils sont toujours en position de position et vous devez déclarer une valeur pour chacun. C'est-à-dire qu'ils se comportent comme s'ils sont convertis en? intérieurement


Dans le code complet, vous avez affiché considérez que vous pouvez effectuer le remplacement en C #, puis utiliser un datadapter pour envoyer toutes les valeurs à la DB.


@Caiusjard J'utilise la fonction Remplacer dans l'accès MS. Vous suggérez de le faire en C # et après cette mise à jour?


N'accède pas à l'utilisation "pour les chaînes? Remplacer par " " pas '' ?


@CAIUSJARD CHR (10), \ "\"); "; va aussi à la décalage de type de données d'exception.


Pause dans le débogueur, copiez la chaîne générée et exécutez-la dans l'accès / corrigez-la là-bas, puis copiez les modifications? Ce n'est plus une erreur d'AC #, son accès refusant d'exécuter un remplacement et je pense qu'il ne peut être qu'une chose vraiment, que la colonne n'est pas compatible pour remplacer (peut-être que le type de données DB Access DB est la mappage de la chaîne C # mais ne peut pas être remplacé () 'd) - Si vous constatez que c'est quelque chose comme ça que vous pouvez ajuster le C #, peut-être simplement attirer l'exception et passer à autre chose


Oui, si vous ne pouvez pas le faire fonctionner pour effectuer le remplacement de l'accès, vous pouvez envisager de modifier les données dans C # puis enregistrer les nouvelles données à la base de données. Vous pouvez utiliser OLEDBCOMMAND Builder pour générer des instructions de mise à jour pour l'adaptateur de données pour sauvegarder avoir pour l'écrire. Mais en utilisant le remplacement de l'accès est certainement plus facile - il suffit de comprendre pourquoi il ne fonctionne pas pour toute la colonne essaie maintenant


3 Réponses :


1
votes

Vous obtenez une erreur de syntaxe car ne peut pas créer un identifiant SQL (nom de la table, nom de colonne, etc.) un paramètre. Seules les valeurs peuvent être paramétrées

Votre requête doit donc ressembler à: xxx

ne concaté jamais des valeurs fournies par l'utilisateur, dans une SQL. Parce que vous êtes obligé dans cette instance de concessurer des noms et des noms de colonnes dans vous devriez absolument vous assurer que seules les valeurs de sécurité sont fournies. Idéalement, vous devriez prendre la valeur fournie pour le nom de la table et le nom de la colonne et disposer de nombreux noms de table et de colonne (vous pouvez interroger le DB pour cela) et permettre uniquement à la SQL de construire si les valeurs fournies sont dans cette liste < / p>

Il s'agit d'une exigence très inhabituelle - presque personne ici cherche à paramétrer les noms de table, etc. Si vous essayez d'écrire une sorte de mini bibliothèque pour faciliter votre vie de données, je vous recommanderais d'utiliser un qui existe déjà comme DAPPER


7 commentaires

Comment je peux le changer dynamique? J'ai besoin d'exécuter Remplacer à toutes les colonnes.


Of, c'est difficile car l'accès n'a rien d'exemple comme SQL Server Information_schema pour répertorier toutes les colonnes et toutes les tables d'une base de données. Je vais faire une autre réponse


En fait, juste une requête rapide - est-ce que cet accès MS? J'ai supposé que c'était mais j'ai alors pensé que je pourrais être autre chose ...


Si j'essaie une concaténation, il affiche system.data.oledb.oledbexception: "Mismachatch de type de données dans l'expression de critères."


Parce que vous ne pouvez exécuter que remplacer les colonnes de type chaîne probablement


Qu'est-ce que je vérifie si (colonne.dataType == typeof (string))


Je ne serais certainement pas certain que le côté C # serait une chaîne et que le côté accès serait également une chaîne - juste parce que le côté C # est une chaîne ne signifie pas que remplacer acceptera le côté accès. Quel type est le côté accès? Quelle colonne échoue spécifiquement et qu'est-ce que c'est le type de données?



0
votes

Vous avez indiqué dans un commentaire que vous essayez d'exécuter un Remplacer sur toutes les colonnes d'une DB avec un effort minimal. Pour cela, vous pouvez envisager ce qui suit:

  • Utilisez la méthode getchema de votre objet dbconnection pour obtenir une liste des tables de la DB
  • boucle sur elle, concaténer une chaîne SQL du nom de la table dans "Sélectionnez * à partir de" + TableMename + "où 1 = 0" et exécutez ce SQL à l'aide d'un datadapter pour renvoyer un jeu de données vide avec toutes les colonnes de la table cible < / li>
  • boucle sur la collection de données de données.Columns est renvoyé à partir de la sélection ci-dessus, exécutant votre SQL de remplacement, sous la modification de la table et des noms de colonne dans Via String Concat (c'est sûr et non piratable car vous avez récupéré la liste et ne concâmez pas les valeurs fournies par un Utilisateur
  • Si vous avez des colonnes non chaîne (dates, INTS), examinez le type de données du DataColumn et exécutez-le uniquement s'il s'agit d'une chaîne / variateur ou similaire

    Liens utiles:

    HTTPS: // DOCS .microsoft.com / fr-US / DotNet / Cadre / Données / Adonet / Getschema-and-Schema-Collections

    https://sizious.com/2015/05/11/how-to-load-an-access-database-into-a-datatabase-Object-in-c/ - va une partie - Ajoutez une clause Where à ce type de ce type de sorte qu'aucune ligne de lignes ne soit renvoyée (vous ne voulez que les colonnes)


1 commentaires

Mon algorithme est pareil. Mais cela va exiger. Ajout du code complet en question.



0
votes

Vous ne pouvez pas remplacer les noms de table et de colonnes avec des paramètres.

Les paramètres ne peuvent être appliqués que comme suit: xxx

Il est préférable de permettre à l'utilisateur de choisir les noms des tables et des colonnes à partir de Comboboxes / Listbox avec des valeurs prêtes à l'emploi. Quelque chose comme ceci: xxx

Notez que vous devez échapper aux caractères de devis unique.


0 commentaires