7
votes

Utilisation des paramètres Insertion des données dans la base de données d'accès

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();
}


2 commentaires

En tant que note latérale, gardez à l'esprit que le préfixe @ 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 implémentations implémentent Idisposable , 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 / ...


3 Réponses :


11
votes

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();
      }
   }
}


4 commentaires

@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 ?


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.



8
votes

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: xxx


0 commentaires

6
votes

Pour Microsoft Access, les paramètres sont basés sur la position et non nommés, vous devez utiliser ? 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.

Voir la documentation pour OLEDBCOMMAND.PARAMETERS Property P>

Remarques h2>

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>

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();
}


0 commentaires