将值存储在Access数据库中

时间:2013-03-29 11:51:11

标签: c# asp.net ms-access insert

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

谢谢:)

1 个答案:

答案 0 :(得分:3)

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

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

首先,您不要给出字段的名称 (为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