15

これは、SQL サーバーからメンバーを追加、更新、削除できる SQL データベースの小さなデモです。

1 つの SQL Server DB に 2 つのテーブルがあり、1 つは「メンバー」、2 番目は「概要」です。

  • メンバーには、個別の ID 列と、名前、住所、電話番号などのメンバーの個人情報があります。
  • 概要では、dID、年、金額の 3 つの列のみがあります。

単一の Windows フォームがあり、言語は C# で、プロジェクトは Visual Studio 2010 でビルドされ、もちろんデータベースは SQL Server 2010 でビルドされます。

Windows フォームには、「リセット、挿入、更新、および削除」ボタンがあります。

  • dID テキスト ボックスの他に、個別の ID を挿入できるボタンがもう 1 つあります。[検索] ボタンをクリックすると、名前、住所、電話番号が表示されるすべてのテキスト ボックスを埋めることで、メンバーについて最後に作成されたエントリが表示されます。これは、メンバーの完全な情報を確認したり、変更を加えたり、dB から削除したりできる機能を果たします。
  • 特に、メンバーが特定の年に特定の金額を支払ったことを示す年と金額の 2 つのテキスト ボックスがあります。

ただし、テキスト ボックスで述べたように、最後に作成されたエントリしか表示されません。私が達成したい機能は、人物 x の dID を挿入した後、挿入できる年のテキスト ボックスでのみ、前の年と、通常はすべてのテキスト ボックスに情報を入力する必要があるプレス検索を言うことです。テキストボックスには、入力した年に応じて、どのくらいの金額があるか、またはメンバーが特定の年に支払っていないことを意味する何もないという 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 SQLDatabase 
{
     public partial class SQLDBDisplay : Form
     {
     SqlConnection con = new SqlConnection("Data Source=JG-PC\\SQLEXPRESS;Initial Catalog=TEST;Integrated Security=True");

     public SQLDBDisplay()
     {
         InitializeComponent();
     }
     SqlDataAdapter da;
     DataSet ds = new DataSet();


     private void btnSearch_Click(object sender, EventArgs e)
     {
         SqlDataReader reader;
         SqlCommand cmd = new SqlCommand();
         try
         {
             string sql = "SELECT * FROM members where dID =  '" + txtdID.Text + "' ";
             txtYear.Text = sql;
             cmd.Connection = con;
             cmd.CommandText = sql;
             con.Open();
             reader = cmd.ExecuteReader();
             while (reader.Read())
             {
                 txtID.Text = reader["ID"].ToString();
                 txtName.Text = reader["Name"].ToString();
                 txtAddress.Text = reader["Address"].ToString();
                 txtMobile.Text = reader["Mobile"].ToString();
                 txtEmail.Text = reader["Email"].ToString();
                 txtdID.Text = reader["dID"].ToString();

             }
             con.Close();

             sql = "SELECT * FROM Overview where dID =  '" + txtdID.Text + "' ";
             txtYear.Text = txtYear.Text + " : " + sql;
             cmd.Connection = con;
             cmd.CommandText = sql;
             con.Open();
             reader = cmd.ExecuteReader();
             while (reader.Read())
             {
                 txtYear.Text = reader["Year"].ToString();
                 txtAmount.Text = reader["Amount"].ToString();
                 txtdID.Text = reader["dID"].ToString();

             }
             con.Close();
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message.ToString());
         }
     }

     private void btnReset_Click(object sender, EventArgs e)
     {
         txtdID.Text = ""; txtName.Text = ""; txtAddress.Text = "";
         txtMobile.Text = ""; txtEmail.Text = ""; txtYear.Text = "";
         txtAmount.Text = "";
     }

     private void btnInsert_Click(object sender, EventArgs e)
     {
         SqlCommand cmd = new SqlCommand();
         string Sql = "INSERT INTO members (dID, Name, Address, Email, Mobile) VALUES ( '" + txtdID.Text+ "','" + txtName.Text + "','"
+ txtAddress.Text + "', '" + txtEmail.Text + "', '" + txtMobile.Text + "')";
         cmd.CommandText = Sql;
         cmd.Connection = con;
         con.Open();
         cmd.ExecuteNonQuery();
         con.Close();
         Sql = "INSERT INTO Overview (dID, Year, Amount) VALUES ('"+ txtdID.Text +"' ,'" + txtYear.Text + "','" + txtAmount.Text +
"')";
         cmd.CommandText = Sql;
         cmd.Connection = con;
         con.Open();
         cmd.ExecuteNonQuery();
         con.Close();
         MessageBox.Show("Record Inserted Scuessfully!!!");
         for (int i = 0; i < this.Controls.Count; i++)
         {
             if (this.Controls[i] is TextBox)
             {
                 this.Controls[i].Text = "";
             }
         }
     }

     private void btnUpdate_Click(object sender, EventArgs e)
     {
          try
         {
             SqlCommand cmd = new SqlCommand();
             string Sql = "Update members set Name = '" + txtName.Text + "', Address = '" + txtAddress.Text + "', Email = '" +
txtEmail.Text + "', Mobile = '" + txtMobile.Text + "'  WHERE dID = '"
+ txtdID.Text + "'";
             cmd.CommandText = Sql;
             cmd.Connection = con;
             con.Open();
             cmd.ExecuteNonQuery();
             con.Close();

             Sql = "Update overview set Year = '" + txtYear.Text + "', Amount = '" + txtAmount.Text + "' WHERE dID = '"+ txtdID.Text+"'";
             cmd.CommandText = Sql;
             cmd.Connection = con;
             con.Open();
             cmd.ExecuteNonQuery();
             MessageBox.Show("Data Scuessfully Updated");
             con.Close();
         }
         catch (Exception error)
         {
             MessageBox.Show(error.ToString());
         }

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

     private void btnDelete_Click(object sender, EventArgs e)
     {
         SqlCommand cmd = con.CreateCommand();
         cmd.CommandType = CommandType.Text;
         cmd.CommandText = "DELETE FROM members WHERE dID = '"+ txtdID.Text +"'";
         con.Open();
         cmd.ExecuteNonQuery();

         cmd.CommandText = "DELETE FROM overview WHERE dID = '" + txtdID.Text + "'";
         cmd.ExecuteNonQuery();
         da = new SqlDataAdapter(cmd);

         MessageBox.Show("Record Scuessfully Deleted !");
         con.Close();

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


     private void btnClose_Click(object sender, EventArgs e)
     {
         Application.Exit();
     }

 } }
4

2 に答える 2

0

列でグループ化する必要がありSELECTますAmount。あなたの質問に対する簡単な答えは、次のように 2 番目の選択クエリを変更することです。

sql = "SELECT Year, dID, SUM(Amount) as Amount FROM Overview where dID =  '" + txtdID.Text + "' AND Year = " + txtYear.Text + "GROUP BY amount";

txtYear.Textおそらく、 SQL パラメーターの値を使用したいので、次のようにします。

txtYear.Text = sql;

txtYear.Text = txtYear.Text + " : " + sql;

コードであまり意味をなさないでください。

もちろん、これはSQL インジェクションの影響を受けやすいため、正しい方法ではありません。SQL インジェクションに関しては確実に安全なSQL ストアド プロシージャを使用することをお勧めします。

コード品質に対するもう 1 つの改善点は、ステートメントを使用して、およびオブジェクトの初期化usingを囲む必要があることです。SQLConnectionSQLCommandSQLDataReader

于 2012-12-19T09:31:43.683 に答える
0

パラメータとSQLインジェクションに関して人々が行ったコメントに解決策を追加するために、データベースに接続するときに以下のコードを使用する傾向があります。

using(SqlConnection connection = new SqlConnection("YOUR CONNECTION STRING"))
{
    try
    {
        using(SqlCommand command = new SqlCommand())
        {
            command.CommandText = "SELECT * FROM members where dID = @MyId";
            command.Connection = connection;

            // Set the SqlDbType to your corresponding type
            command.Parameters.Add("@MyId", SqlDbType.VarChar).Value = txtdID.Text;

            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                txtID.Text = reader["ID"].ToString();
                txtName.Text = reader["Name"].ToString();
                txtAddress.Text = reader["Address"].ToString();
                txtMobile.Text = reader["Mobile"].ToString();
                txtEmail.Text = reader["Email"].ToString();
                txtdID.Text = reader["dID"].ToString();

            }
        }
    }
    finally
    {
        connection.Close();
    }
 }
于 2012-12-19T09:36:51.090 に答える