使用参数将数据插入访问数据库

Posted

技术标签:

【中文标题】使用参数将数据插入访问数据库【英文标题】:Using parameters inserting data into access database 【发布时间】:2011-08-19 03:02:57 【问题描述】:

我有以下方法可以将数据插入到一个访问数据库中,它工作正常,但如果我尝试插入包含我学过的单引号的文本,我会遇到问题。

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

据我了解,解决问题的方法之一是使用参数。老实说,我不知道该怎么做。如何更改上面的代码,以便使用参数插入数据?

【问题讨论】:

附带说明,请记住 @ 前缀使字符串文字为 verbatim,这意味着您的连接字符串跨越多行,并且中间有一堆空格。此外,所有DbCommand 实现都实现IDisposable,这意味着您应该在使用后处理您的命令。 只需阅读文档! msdn.microsoft.com/en-us/library/… 【参考方案1】:

与任何其他查询相同:

a) 将 OleDbCommand 中的实际硬编码参数替换为占位符(以 @ 为前缀), b) 将OleDbParameter 的实例添加到DbCommand.Parameters 属性。参数名称必须与占位符名称匹配。

[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:我现在没有可以检查的电脑,但你确定命名参数(带有@前缀)不适用于OleDbCommand吗? 我知道这是一个旧线程,但值得澄清一下:“OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的位置参数,而不是命名参数。 "因此 Insert 语句应该使用 ?而不是命名参数。 这是根据 MSDN 文章:msdn.microsoft.com/en-us/library/… 重要提示:对于 Access 数据库,您必须按照它们在查询中出现的顺序添加参数。【参考方案2】:

您必须使用参数来插入值。它也是一个安全问题。 如果你这样做,可以进行 sql 注入。

试试这样:

string ConnString = Utils.GetConnString();
string SqlString = "Insert Into Contacts (FirstName, LastName) Values (?,?)";
using (OleDbConnection conn = new OleDbConnection(ConnString))

  using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
  
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("FirstName", txtFirstName.Text);
    cmd.Parameters.AddWithValue("LastName", txtLastName.Text);
    conn.Open();
    cmd.ExecuteNonQuery();
  

【讨论】:

【参考方案3】:

对于 Microsoft Access,参数基于位置而不是命名,您应该使用 ? 作为占位符,尽管如果您使用名称参数,只要它们的顺序相同,代码也可以工作。

查看OleDbCommand.Parameters Property的文档

备注

当 CommandType 设置为 Text 时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameter 对象添加到 OleDbParameterCollection 的顺序必须直接对应于命令文本中参数的问号占位符的位置。

请务必包含将使用参数的预期架构类型以及架构长度(如果适用)。

我还建议您始终在类型实现IDisposable 的实例周围使用using 语句,例如OleDbConnection,这样即使代码中抛出异常,连接也始终关闭。

更改代码:

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

【讨论】:

以上是关于使用参数将数据插入访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

mongodb数据库中插入数据

使用.net核心将数据插入访问数据库

将日期插入访问数据库

“无效参数编号:未定义参数” 插入数据

C# 将表单中的数据插入访问数据库

如何使用 C# 仅将日期(不包括时间)插入 ms 访问数据库