0

我基本上想将一些值存储到数据库中。
我不断收到"Number of query values and destination fields are not the same." 指向“ dr = cmd.ExecuteReader();

有人可以帮助我吗?:)
我对整个事情有点陌生,真的不知道发生了什么。
贝娄是正在使用的代码。

public partial class Registeration_experiment : System.Web.UI.Page
{
    static OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\New folder\Project 1.0\WebSite1\New Microsoft Office Access 2007 Database.accdb");
    OleDbDataAdapter ada = new OleDbDataAdapter();
    OleDbCommand cmd = new OleDbCommand();
    OleDbDataReader dr;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string str = "insert into Registeration_Test (Name1, address, emailaddress)" +
          "values (?, ?, ?)";
        con.Open();
        cmd = new OleDbCommand(str, con);
        cmd.Parameters.AddWithValue("@p1", TextBox1.Text);
        cmd.Parameters.AddWithValue("@p2", TextBox2.Text);
        cmd.Parameters.AddWithValue("@p4", TextBox4.Text);
        cmd.ExecuteNonQuery(); 
    }
}

谢谢 :)

4

1 回答 1

3

您正在写入数据库,而不是从中读取。
使用 ExecuteReader 没有意义,你需要一个 ExecuteNonQuery

编辑 现在看到表的结构。它由5个字段组成。
在这种情况下,您有两个选择。在插入语句中提供要更新的字段名称或为每个字段添加参数

第一选择,您不提供字段的名称(为除 ID 之外的每个字段传递一个参数,因为我认为它是一个 AutoIncrement 字段,这意味着数据库自己管理该字段的值)

// No name provided for fields, need to pass a parameter for each field
string str = "insert into Registeration_Test values (?, ?, ?, ?)";
con.Open();
cmd = new OleDbCommand(str, con);
cmd.Parameters.AddWithValue("@p1", Textbox1.Text);
cmd.Parameters.AddWithValue("@p2", Textbox2.Text);
cmd.Parameters.AddWithValue("@p3", Textbox3.Text);
cmd.Parameters.AddWithValue("@p4", Textbox4.Text);
cmd.ExecuteNonQuery();

(注意,TextBox1...等是您在上面的示例中提供的名称,我不知道用户键入要插入数据库的数据的这些文本框的确切内容,也不知道是否它们确实存在于您的页面/表单中)

第二种选择,你在数据库中声明应该更新的字段

// Just three named fields updated
string str = "insert into Registeration_Test (Name1, address, emailaddress)" + 
             "values (?, ?, ?)";
con.Open();
cmd = new OleDbCommand(str, con);
cmd.Parameters.AddWithValue("@p1", Textbox1.Text);
cmd.Parameters.AddWithValue("@p2", Textbox2.Text);
cmd.Parameters.AddWithValue("@p4", Textbox4.Text);
cmd.ExecuteNonQuery();

另请注意,我已将您的 sql 命令更改为不使用字符串连接。
这是一种非常糟糕的做法,会导致许多问题。最糟糕的是Sql Injection,更不用说当文本包含单引号或其他有问题的字符时字符串解析的问题

参数占位符(在 OleDb 中)由?命令文本中的 表示。此占位符将被 OleDbCommand 的参数集合中添加的实际值替换(按占位符出现的确切顺序)。使用参数(参数化查询)允许框架检查传递的值并在这些值无效时采取适当的措施。

编辑 连接问题来自上一个使连接保持打开状态的命令。这是另一个不好的做法。每个连接都应该是:创建、打开、使用、关闭。要遵循的伪代码是这样的

// Create the connection
using(OleDbConnection con = GetOleDbConnection())
{
    con.Open();

    ... // use the connection with insert/delete/update/select commands

}
// Exiting from the using block close and destroy (dispose) the connection
于 2013-03-29T11:55:22.877 回答