在参数列表中添加空字符串以插入到AccessDB中

本文关键字:插入 AccessDB 字符串 参数 列表 添加 | 更新日期: 2023-09-27 18:18:22

我试图使用System.Data.OleDb命名空间和方法OleDbCommandObject.ExecuteNonQuery()将数据插入Access数据库,但我正在接收以下错误:

OleDbParameterCollection只接受非空的OleDbParameter类型对象。参数名称:value

参数?_[#]没有默认值

我的大多数参数都是字符串对象,当通过表单给它们赋值时,它们工作得很好。然而,当一个非必需的字段留空时(例如someString = "),并且提交了表单,那么就会发生错误。我在这个网站和其他提到可能解决方案的网站上寻找答案,如:

  • OleDb使用?而不是名称值
  • 确保参数的数量与?的数量相匹配,并且以正确的顺序插入。
  • command.Parameters使用。添加新的OleDbParameter("Name",OleDbType)。VarChar, 50,"Column")。Value = someString);或者类似的东西。
  • command.Parameters使用。AddWithValue("parameterName",someString);

我可以将字符串的值设置为"[space]",但是这样就删除了形式中的占位符,这是不理想的,而且我认为应该没有必要。如果我必须在将值添加到参数列表之前检查空字符串并添加空格,那么我会这样做,但我希望尽可能避免额外的代码。

下面是我使用的代码示例:

Customer.cs

    public class Customer
    {
    [Required]
    public string ContactFirstName { get; set; }
    [Required]
    public string ContactLastName { get; set; }
    public string Email {get; set; }
    public string Phone {get; set; }
    public Customer()
    {
        this.ContactFirstName = "";
        this.ContactLastName = "";
        this.Email = "";
        this.Phone = "";
    }
    }

插入数据的方法

public int InsertValues(Customer customer)
{
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection
this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (?,?,?,?)";
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand
//Add parameters
this.dbComm.Parameters.AddWithValue("ContactFirstName", customer.ContactFirstName);
this.dbComm.Parameters.AddWithValue("ContactLastName", customer.ContactLastName);
this.dbComm.Parameters.AddWithValue("Email", customer.Email);
this.dbComm.Parameters.AddWithValue("Phone", customer.Phone);
this.dbComm.ExecuteNonQuery();
//--Snip--
}

我使用的ODBC驱动程序是Microsoft.OleDb.ACE.12.0。如果您能给我指引正确的方向,我将不胜感激。

在参数列表中添加空字符串以插入到AccessDB中

change this

public int InsertValues(Customer customer)
{
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection
this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (@ContactFirstName,@ContactLastName,@Email,@Phone)";
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand
//Add parameters
this.dbComm.Parameters.AddWithValue("@ContactFirstName", customer.ContactFirstName);
this.dbComm.Parameters.AddWithValue("@ContactLastName", customer.ContactLastName);
this.dbComm.Parameters.AddWithValue("@Email", customer.Email);
this.dbComm.Parameters.AddWithValue("@Phone", customer.Phone);
this.dbComm.ExecuteNonQuery();
//--Snip--
}

我相信可能有其他的解决方案来解决这个问题,但这是我通过尝试和错误发现的一个,它添加了少量的代码,并且可以通过制作一个方法来改进它。

正如OP和Gökhan Girgin的回应中指出的那样,AddWithValue方法应该类似于:

OleDbCommandObject.Parameters.AddWithValue("Whatever you want here", Value);

现在,我的主要重点是在参数列表中添加一个不包含值的字符串值(即在用户将字段留空的形式中)。字符串只是空白,如"[no_space]"。在提交表单时,这个值从"[no_space]"变为null。尝试将值类型强制转换为字符串类型并不能解决问题。我找到的解决方案是将另一个空字符串连接到Value.

下面的任何组合我都发现了工作,尽管这个列表很可能并不详尽。请确保在使用OleDb添加参数时,其顺序与INSERT语句的顺序相同。

OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone);
OleDbCommandObject.Parameters.AddWithValue("@Phone", customer.Phone + "");
OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone + "");

再一次,对我来说,这是没有意义的,除非在表单提交时将值更改为null,因为字符串已经在构造函数中设置为"[no_space]"。我看不出添加另一个"[no_space]"如何改变任何东西,但它被接受并且没有发生错误。如果有人能说明为什么这是有效的,我将不胜感激。

对于那些遇到这个问题的人,我希望这篇文章能有所帮助。