J'ai la méthode suivante pour insérer des données dans une base de données d'accès qui fonctionne bien, mais je reçois un problème si j'essaie d'insérer du texte contenant des guillemets simples que j'ai apprises.
[WebMethod] public void bookRatedAdd(string title, int rating, string review, string ISBN, string userName) { OleDbConnection conn; conn = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("App_Data\\BookRateInitial.mdb")); conn.Open(); OleDbCommand cmd = conn.CreateCommand(); cmd.CommandText = @"INSERT INTO bookRated([title], [rating], [review], [frnISBN], [frnUserName])VALUES('" + title + "', '" + rating + "','" + review + "','" + ISBN + "', '" + userName + "')"; cmd.ExecuteNonQuery(); conn.Close(); }
3 Réponses :
Même chose que pour toute autre requête:
a) Remplacez les paramètres codés en dur réels dans votre OLEDBCOMMAND CODE>
avec des espaces réservés (préfixés avec @ code>),
b) Ajoutez des instances de OLEDBParameter code>
au DBCommand. Paramètres code>
propriété. Les noms de paramètres doivent correspondre aux noms d'espace réservé. P> [WebMethod]
public void bookRatedAdd(string title, int rating, string review, string ISBN, string userName)
{
using (OleDbConnection conn = new OleDbConnection(
"Provider=Microsoft.Jet.OleDb.4.0;"+
"Data Source="+Server.MapPath("App_Data\\BookRateInitial.mdb"));
{
conn.Open();
// DbCommand also implements IDisposable
using (OleDbCommand cmd = conn.CreateCommand())
{
// create command with placeholders
cmd.CommandText =
"INSERT INTO bookRated "+
"([title], [rating], [review], [frnISBN], [frnUserName]) "+
"VALUES(@title, @rating, @review, @isbn, @username)";
// add named parameters
cmd.Parameters.AddRange(new OleDbParameter[]
{
new OleDbParameter("@title", title),
new OleDbParameter("@rating", rating),
...
});
// execute
cmd.ExecuteNonQuery();
}
}
}
@Milen: Je n'ai pas de PC où je peux vérifier maintenant, mais êtes-vous sûr que les paramètres nommés (avec @ préfixes) ne fonctionnent pas avec le OLEDBCOMMAND code>?
Je sais que c'est un vieux fil, mais il convient de clarifier des choses un peu: "Le fournisseur de données Framework Ole db.NET utilise des paramètres de position marqués d'un point d'interrogation (?) Au lieu de paramètres nommés." Une déclaration d'insertion devrait-elle utiliser? au lieu de paramètres nommés.
C'est comme selon MSDN Article: MSDN.MicRosoft.com / fr-nous / bibliothèque / ...
IMPORTANT: Pour les bases de données d'accès, vous devez ajouter les paramètres dans le même ordre qu'ils apparaissent dans la requête.
Vous devez utiliser le paramètre pour insérer des valeurs. C'est aussi un problème de sécurité. Si vous le faites comme une injection SQL pouvant être faite.
Essayez comme ceci: p>
Pour Microsoft Access, les paramètres sont basés sur la position et non nommés, vous devez utiliser Voir la documentation pour OLEDBCOMMAND.PARAMETERS Property P> Le fournisseur OLE DB .NET ne prend pas en charge les paramètres nommés pour passer des paramètres de passage à une instruction SQL ou une procédure stockée appelée par un OLEDBCOMMAND lorsque CommandType est défini sur le texte. Dans ce cas, l'espace réservé à la marque (?) Doit être utilisé. Par exemple: p>
? code> en tant que symbole de l'espace réservé bien que le code fonctionnerait si vous avez utilisé des paramètres de noms à condition qu'ils soient dans le même ordre.
Remarques h2>
var connectionStringHere = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("App_Data\\BookRateInitial.mdb";
using (var conn = new OleDbConnection(connectionStringHere))
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO bookRated ([title], [rating], [review], [frnISBN], [frnUserName]) VALUES(?, ?, ?, ?, ?)";
cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) { Value = title});
cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Integer) { Value = rating });
cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 2000) { Value = review });
cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 60) { Value = ISBN });
cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 256) { Value = userName });
conn.Open();
var numberOfRowsInserted = cmd.ExecuteNonQuery();
}
En tant que note latérale, gardez à l'esprit que le préfixe
@ code> rend la chaîne littéral Verbatim , ce qui signifie que votre chaîne de connexion couvre plusieurs lignes et a un tas d'espaces au milieu. En outre, tous
dbcommand code> implémentations implémentent
Idisposable code>, ce qui signifie que vous devez disposer de votre commande après utilisation.
Il suffit de lire les docs! MSDN.MicRosoft.com/EN-US/ Bibliothèque / ...