可能重复:
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();
}
}
}
答案 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]
赋值textBox1
,dRow[1]
textBox2
的值,等等。
看起来您犯了一个简单的复制错误,因为您已经将textBox4
的值分配给dRow[3]
(正确),并且在下一行中您尝试执行相同的操作dRow[4]
这是一个根本不存在的列。
根据您的更新 - 您似乎正在尝试添加新行并将值分配给第0列,这是一个自动增量列。数据库将自己处理此列,您无需为其分配值。
答案 1 :(得分:0)
这通常意味着您在数据库中没有任何行(因此NavigateRecords(..)中的Rows [0]实际上并不存在),或者您尝试获取的列值不是存在。您确定该表中有4列吗?