将新记录添加到Access数据库

时间:2012-09-28 09:24:39

标签: c# ms-access-2007

  

可能重复:
  Error while adding records to access database from c#.net

我需要使用以下代码将新记录添加到Access数据库,但我得到IndexOutOfRangeException。我试图解决它,但我无法得到解决方案。我该如何克服这个错误?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        System.Data.OleDb.OleDbConnection con;
        DataSet ds1;
        System.Data.OleDb.OleDbDataAdapter da;
        int MaxRows = 0;
        int inc = 0;

        private void Form2_Load(object sender, EventArgs e)
        {
            con = new System.Data.OleDb.OleDbConnection();
            ds1 = new DataSet();
            con.ConnectionString ="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:/Users/JaYam/Documents/jaya.accdb";
            string sql = "SELECT * From Table1"; 
            da = new System.Data.OleDb.OleDbDataAdapter(sql, con);
            con.Open();
            da.Fill(ds1, "Table1");
            NavigateRecords(); 
            con.Close();
            con.Dispose();
        }
        private void NavigateRecords()
        {
            DataRow drow =ds1.Tables["Table1"].Rows[0];
            textBox1.Text = drow.ItemArray.GetValue(0).ToString();
            textBox2.Text = drow.ItemArray.GetValue(1).ToString();
            textBox3.Text = drow.ItemArray.GetValue(2).ToString();
            textBox4.Text = drow.ItemArray.GetValue(3).ToString();
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            con = new System.Data.OleDb.OleDbConnection();
            ds1 = new DataSet();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/Users/JaYam/Documents/jaya.accdb";
            string sql = "SELECT * From Table1";
            da = new System.Data.OleDb.OleDbDataAdapter(sql, con);
            con.Open();
            da.Fill(ds1, "Table1");
            NavigateRecords();


            System.Data.OleDb.OleDbCommandBuilder cb;
            cb = new System.Data.OleDb.OleDbCommandBuilder(da);
            DataRow dRow = ds1.Tables["Table1"].NewRow();
            //dRow[0] = textBox1.Text;
            dRow[1] = textBox2.Text;
            dRow[2] = textBox3.Text;
            dRow[3] = textBox4.Text;
            dRow[4] = textBox4.Text;
            ds1.Tables["Table1"].Rows.Add(dRow);
            MaxRows = MaxRows + 1;
            inc = MaxRows - 1;
            da.Update(ds1, "Table1");
            MessageBox.Show("Entry Added");
            con.Close();
            con.Dispose();

        }

    }
}     

2 个答案:

答案 0 :(得分:1)

您正试图通过dRow[4]访问第五个不存在的列。 4意味着您正在尝试访问第五个元素,因为索引在大多数编程语言中都是从零开始的。第一个索引是0,第二个是1,第三个是2,等等。

考虑这段代码,您可以在其中获取值:

textBox1.Text = drow.ItemArray.GetValue(0).ToString();
textBox2.Text = drow.ItemArray.GetValue(1).ToString();
textBox3.Text = drow.ItemArray.GetValue(2).ToString();
textBox4.Text = drow.ItemArray.GetValue(3).ToString();

注意如何将地点0的值提取到textBox1。您尝试保存值时需要复制此行为,因此请为dRow[0]赋值textBox1dRow[1] textBox2的值,等等。

看起来您犯了一个简单的复制错误,因为您已经将textBox4的值分配给dRow[3](正确),并且在下一行中您尝试执行相同的操作dRow[4]这是一个根本不存在的列。


根据您的更新 - 您似乎正在尝试添加新行并将值分配给第0列,这是一个自动增量列。数据库将自己处理此列,您无需为其分配值。

答案 1 :(得分:0)

这通常意味着您在数据库中没有任何行(因此NavigateRecords(..)中的Rows [0]实际上并不存在),或者您尝试获取的列值不是存在。您确定该表中有4列吗?