-3

重複の可能性:
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();

        }

    }
}     
4

2 に答える 2

1

によって5番目の存在しない列にアクセスしようとしていますdRow[4]。ほとんどのプログラミング言語ではインデックスはゼロベースであるため、4は5番目の要素にアクセスしようとしていることを意味します。最初のインデックスは0、2番目は1、3番目は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に値を割り当てようとしているようです。データベースはこの列自体を処理します。それに値を割り当てる必要はありません。

于 2012-09-28T09:52:48.267 に答える
0

これは通常、データベースに行がない(したがって、NavigateRecords(..)のRows [0]が実際には存在しない)か、存在しない列値を取得しようとしていることを意味します。そのテーブルに4つの列がありますか?

于 2012-09-28T09:35:30.067 に答える