0

ここに画像の説明を入力してくださいデータベースにレコードを挿入するフォームがあります。2つのテーブルがあり、table_1はと呼ばれmembers、table_2はと呼ばれAmountます。

私は2つのSQLINSERTステートメントを使用してレコードをデータベースに送信しています。これは私が理解した方法であるためです。他の方法があるかもしれませんが、私にはわかりません。

レコードを挿入すると、正常に挿入されたというメッセージが表示されますが、データベースを確認すると、挿入されたレコードが現在のレコードに置き換わるため、DB内の最後のレコードが数回繰り返されます。手伝ってください。

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

namespace CemiyetAidatSistem
{
    public partial class AddMember : Form
    {
        public AddMember()
        {
            InitializeComponent();
        }
        SqlConnection con = new SqlConnection("Data Source=My-PC\\SQLSERVER;Initial Catalog=FredericiaDernek;Integrated Security=True");

        private void btnInsert_Click(object sender, EventArgs e)
        {
            SqlCommand cmd = new SqlCommand();
            string Sql = "INSERT INTO Uyeleri ( dID, FullName, Address, Mobile, Email, Comments ) VALUES ('" + txtdID.Text + "', '" + txtAdiSoyadi.Text + "','" + txtAddress.Text + "','" + txtMobile.Text + "','" + txtEmail.Text + "','" + txtComments.Text + "')";
            cmd.CommandText = Sql;
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

            Sql = "INSERT INTO Aidat (dID Year, Amount ) VALUES ('"+ txtdID.Text +"','" + txtYear.Text + "','" + txtAmount.Text + "')";
            cmd.CommandText = Sql;
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

            for (int i = 0; i < this.Controls.Count; i++)
            {
                if (this.Controls[i] is TextBox)
                {
                    this.Controls[i].Text = "";
                }
            }
            MessageBox.Show("Data Added Scuessfully");
        }

    }
}
4

2 に答える 2

2

エラーと悪い習慣を修正するためにあなたのコードを書き直しました

string connString = "Data Source=My-PC\\SQLSERVER;Initial Catalog=FredericiaDernek;Integrated Security=True";

private void btnInsert_Click(object sender, EventArgs e)
{
    using(SqlConnection con = new SqlConnection(connString))
    {
        con.Open();
        string Sql = "INSERT INTO Uyeleri (dID, FullName, Address, Mobile, Email, Comments ) " + 
                     "VALUES (@id, @name, @address, @mobile, @email, @comments");
        using(SqlCommand cmd = new SqlCommand(Sql, con))
        {
            cmd.Parameters.AddWithValue("@id", txtdID.Text);
            cmd.Parameters.AddWithValue("@name", txtAdiSoyadi.Text);
            cmd.Parameters.AddWithValue("@address", txtAddress.Text);
            cmd.Parameters.AddWithValue("@mobile", txtMobile.Text);
            cmd.Parameters.AddWithValue("@email", txtEmail.Text);
            cmd.Parameters.AddWithValue("@comments", txtComments.Text);
            cmd.ExecuteNonQuery();

            Sql = "INSERT INTO Aidat (dID, [Year], Amount ) VALUES " + 
                  "(@id, @year, @amount)";
            cmd.Parameters.Clear();
            cmd.CommandText = Sql;  // <- missing this in the previous version.....
            cmd.Parameters.AddWithValue("@id", txtdID.Text);
            cmd.Parameters.AddWithValue("@name", txtYear.Text);
            cmd.Parameters.AddWithValue("@amount", txtAmount.Text);
            cmd.ExecuteNonQuery();
        }
    }

私が変更したもの:

  • 2番目の挿入ステートメントが間違っています。1列目と2列目の間にコンマがありません
  • グローバルレベルでのSqlConnectionの作成を削除しました
  • 例外の場合にもSqlConnectionとSqlCommandを破棄するための適切なusingステートメントを追加しました
  • 2つの挿入ステートメントに使用されるパラメーター
  • Yearフィールドの前後に角かっこを追加しました(YearはT-SQLで予約されているキーワードです)

グローバルレベルでSqlConnectionを作成するのは悪いことです。なぜなら、システムリソースを取得し、アプリケーションの存続期間中はそれらを破棄しないからです。また、例外が正しく処理されない場合、状況が制御不能になる可能性があります。

今、私はあなたのテーブルについていくつか疑問を持っています。フィールドdID(両方のテーブル)と金額はテキストタイプ(varchar、nvarchar)?です。数値タイプの場合は、パラメータコレクションに値を追加する前に変換を追加する必要があります

于 2012-12-22T16:15:46.870 に答える
1

また、forループを変更して、これを置き換えるコントロールをクリアすることをお勧めします

for (int i = 0; i < this.Controls.Count; i++)
{
    if (this.Controls[i] is TextBox)
    {
        this.Controls[i].Text = "";
    }
}

linqを使用して次のコードを使用します。

this.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Clear());

「これ」はフォームの名前を指すことに注意してください

だからそれは

(YourWinFormsName).Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Clear());
于 2012-12-22T16:23:53.870 に答える