在Access数据库中存储值

本文关键字:存储 数据库 Access | 更新日期: 2023-09-27 18:06:23

我基本上想在数据库中存储一些值。
我一直得到错误"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(); 
    }
}

谢谢你

在Access数据库中存储值

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

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

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

// 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注入,更不用说当文本包含单引号或其他有问题的字符

时的字符串解析问题了。

参数占位符由命令文本中的?表示(在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