Comment corriger les paramètres d'envoi sur MyCode est P> Query OLEDB CODE>?
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();
}
}
}
}
3 Réponses :
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 à: p> 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 P> P>
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." Code>
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?
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: P>
Liens utiles: P>
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) p>
Mon algorithme est pareil. Mais cela va exiger. Ajout du code complet en question.
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: p> 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: p> Notez que vous devez échapper aux caractères de devis unique. P> p>
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
" " code> pas
'' code>?
@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