質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.22%

Windowsフォーム入力値をinsertする画面中ですが、SQLで落ちてしまいます

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,768

yamaguti

score 132

お世話になります。
画面から入力値を受取り、insertする処理を実装しております。
エラーの解消方法が分からないので、質問させて頂きます。
ご教示のほどよろしくお願い致します

エラー内容:228行目
cmd.Parameters.Add("  登録者ID", System.Data.DbType.String);

System.ArgumentOutOfRangeException: 'インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。'

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Globalization;
using System.Data.SQLite;

namespace 基幹システム.給料管理
{
    public partial class kyuyotouroku : Form
    {

        public kyuyotouroku()
        {
            InitializeComponent();

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void splitContainer1_Panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void kyuyotouroku_Load(object sender, EventArgs e)
        {
            //画面ロード時に初期値を当年で設定
            var TounenY = DateTime.Now;
            comboYD.Text = TounenY.Year.ToString();

            var TougetuM = DateTime.Now;
            comboM.Text = TougetuM.Month.ToString();

            #region タブインデックスがずれたので設定
            this.textsikyou.TabIndex = 1;
            this.textkouzyoSUM.TabIndex = 2;
            this.textsasihikiSUM.TabIndex = 3;
            this.textsonotakou.TabIndex = 4;
            this.textsyotoku.TabIndex = 5;
            this.textkenko.TabIndex = 6;
            this.textkousei.TabIndex = 7;
            this.textkoyou.TabIndex = 8;
            #endregion
        }

        private void btnback_Click(object sender, EventArgs e)
        {
            //給与管理画面を開く
            基幹システム.給料管理.kyuyo kyuyo = new 給料管理.kyuyo();

            kyuyo.Show();
            this.Visible = false;
        }

        private void textsikyou_KeyDown(object sender, KeyEventArgs e)
        {
        }
        #region 金額を3桁で区切る処理
        private void textsikyou_Validated(object sender, EventArgs e)
        {
            //支給金合計
            if (textsikyou.Text == "")
            {

            }
            else
            {
                var str = textsikyou.Text;
                var a = string.Format("{0:#,##0}", Int32.Parse(str));
                textsikyou.Text = a;
            }
        }

        private void textkouzyoSUM_Validated(object sender, EventArgs e)
        {
            //控除金合計
            if (textkouzyoSUM.Text == "")
            {

            }
            else
            {
                var str1 = textkouzyoSUM.Text;
                var a = string.Format("{0:#,##0}", Int32.Parse(str1));
                textkouzyoSUM.Text = a;
            }
        }

        private void textsasihikiSUM_Validated(object sender, EventArgs e)
        {
            //差引支給額
            if (textsasihikiSUM.Text == "")
            {

            }
            else
            {
                var str2 = textsasihikiSUM.Text;
                var a = string.Format("{0:#,##0}", Int32.Parse(str2));
                textsasihikiSUM.Text = a;
            }
        }

        private void textsonotakou_Validated(object sender, EventArgs e)
        {
            //その他・控除
            var str3 = textsonotakou.Text;
            var a = string.Format("{0:#,##0}", Int32.Parse(str3));
            textsonotakou.Text = a;
        }

        private void textsyotoku_Validated(object sender, EventArgs e)
        {
            //所得税
            var str4 = textsyotoku.Text;
            var a = string.Format("{0:#,##0}", Int32.Parse(str4));
            textsyotoku.Text = a;
        }

        private void textkenko_Validated(object sender, EventArgs e)
        {
            //健康保険
            var str5 = textkenko.Text;
            var a = string.Format("{0:#,##0}", Int32.Parse(str5));
            textkenko.Text = a;
        }

        private void textkousei_Validated(object sender, EventArgs e)
        {
            //厚生年金
            var str6 = textkousei.Text;
            var a = string.Format("{0:#,##0}", Int32.Parse(str6));
            textkousei.Text = a;
        }

        private void textkoyou_Validated(object sender, EventArgs e)
        {
            //雇用保険
            var str7 = textkoyou.Text;
            var a = string.Format("{0:#,##0}", Int32.Parse(str7));
            textkoyou.Text = a;
        }

        #endregion

        private void btntouroku_Click(object sender, EventArgs e)
        {
            #region テキストボックスを空にする
            textsikyou.ResetText();
            textkouzyoSUM.ResetText();
            textsasihikiSUM.ResetText();
            textsyotoku.ResetText();
            textkenko.ResetText();
            textkousei.ResetText();
            textkoyou.ResetText();
            textsonotakou.ResetText();
            #endregion

        }

        private void btnclear_Click(object sender, EventArgs e)
        {
            string dbpath = Application.StartupPath + @"\kabukanri.db";
            using (SQLiteConnection con = new SQLiteConnection("Data Source=" + dbpath))
            {
                con.Open();
                DataTable datatable = new DataTable();


                using (SQLiteTransaction trans = con.BeginTransaction())
                {
                    //給料テーブルinsert用
                    StringBuilder sql = new StringBuilder();
                    SQLiteCommand cmd = con.CreateCommand();

                    #region 給料テーブル insert文 
                    sql.AppendLine("insert into 給料テーブル ");
                    sql.AppendLine("(  ");
                    sql.AppendLine("  , 登録者ID");
                    sql.AppendLine("  , 年度");
                    sql.AppendLine("  , 月度");
                    sql.AppendLine("  , 支給金合計");
                    sql.AppendLine("  , 控除金合計");
                    sql.AppendLine("  , 差引支給額");
                    sql.AppendLine("  , 所得税");
                    sql.AppendLine("  , 健康保険");
                    sql.AppendLine("  , 厚生年金");
                    sql.AppendLine("  , 雇用保険");
                    sql.AppendLine("  , その他税・控除等");
                    sql.AppendLine("  , DEL_FLG )");
                    sql.AppendLine("VALUES ( ");
                    sql.AppendLine("  , @登録者ID");
                    sql.AppendLine("  , @年度");
                    sql.AppendLine("  , @月度");
                    sql.AppendLine("  , @支給金合計");
                    sql.AppendLine("  , @控除金合計");
                    sql.AppendLine("  , @差引支給額");
                    sql.AppendLine("  , @所得税");
                    sql.AppendLine("  , @健康保険");
                    sql.AppendLine("  , @厚生年金");
                    sql.AppendLine("  , @雇用保険");
                    sql.AppendLine("  , @その他税・控除等");
                    sql.AppendLine("  , 0");
                    sql.AppendLine(") ");

                    //cmd.Parameters.Add("ID", System.Data.DbType.String);
                    cmd.Parameters.Add("  登録者ID", System.Data.DbType.String);
                    cmd.Parameters.Add("  年度", System.Data.DbType.String);
                    cmd.Parameters.Add("  月度", System.Data.DbType.String);
                    cmd.Parameters.Add("  支給金合計", System.Data.DbType.String);
                    cmd.Parameters.Add("  控除金合計", System.Data.DbType.String);
                    cmd.Parameters.Add("  差引支給額", System.Data.DbType.String);
                    cmd.Parameters.Add("  所得税", System.Data.DbType.String);
                    cmd.Parameters.Add("  健康保険", System.Data.DbType.String);
                    cmd.Parameters.Add("  厚生年金", System.Data.DbType.String);
                    cmd.Parameters.Add("  雇用保険", System.Data.DbType.String);
                    cmd.Parameters.Add("  その他税・控除等", System.Data.DbType.String);

                    cmd.Parameters["登録者ID"].Value = texttouroku.Text;
                    cmd.Parameters["年度"].Value = comboYD.Text;
                    cmd.Parameters["月度"].Value = textkouzyoSUM.Text;
                    cmd.Parameters["支給金合計"].Value = textsasihikiSUM.Text;
                    cmd.Parameters["控除金合計"].Value = textkouzyoSUM.Text;
                    cmd.Parameters["差引支給額"].Value = textsasihikiSUM.Text;
                    cmd.Parameters["所得税"].Value = textsyotoku.Text;
                    cmd.Parameters["健康保険"].Value = textkenko.Text;
                    cmd.Parameters["厚生年金"].Value = textkousei.Text;
                    cmd.Parameters["雇用保険"].Value = textkoyou.Text;
                    cmd.Parameters["その他税・控除等"].Value = textsonotakou.Text;

                    cmd.CommandText = sql.ToString();
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                    MessageBox.Show("登録が完了しました。");


                    #endregion
                }
            }
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

登録者IDの前についているスペースが邪魔だからです。
"  登録者ID" で登録したものを "登録者ID" で参照しているのが問題です。

後、質問とは関係ないですが以下の部分にもちょっとした間違いがあるのに気づきました。

   sql.AppendLine("insert into 給料テーブル ");
                    sql.AppendLine("(  ");
                    sql.AppendLine("  , 登録者ID");    // 「,」が余分です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る