2

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

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

范围 ?_[#] 没有默认值

我的大多数参数都是字符串对象,当通过表单为它们分配值时它们可以正常工作。但是,当非必填字段留空(即 someString = "")并提交表单时,就会发生错误。我在这个网站和其他提到可能的解决方案的网站上四处寻找答案,例如:

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

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

这是我正在使用的代码示例:

客户.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。任何可以引导我走向正确方向的帮助或信息将不胜感激。

4

2 回答 2

0

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

正如 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]”如何改变任何东西,但它被接受并且没有发生错误。如果有人能阐明为什么会这样,将不胜感激。

对于遇到此问题的其他人,我希望这会有所帮助。

于 2013-06-14T12:44:39.837 回答
0

改变这个

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--
}
于 2013-06-13T23:33:45.257 回答