2017-06-23 19 views
0

には、2つのsqlコマンドと異なるテーブルのコマンドがあります。 ここに私のコードです。2 SQLコマンド異なるテーブルへの挿入と更新

private void button1_Click(object sender, EventArgs e) 
    { 
     string txtbx9 = textBox9.Text.ToString(); 
     string cmbbx2 = comboBox2.SelectedItem.ToString(); 
     string name = textBox1.Text.ToString(); 
     string surname = textBox2.Text.ToString(); 
     string company = textBox3.Text.ToString(); 
     string txtbx8 = textBox8.Text.ToString(); 
     string sts = "In House"; 

      try 
      { 
       connection.Open(); 


       MessageBox.Show("Payment approved."); 
       richTextBox1.Text = richTextBox1.Text + "The hotel received " + txtbx9 + " from this guest"; 
       string rtb = richTextBox1.Text.ToString(); 

      OleDbCommand command = new OleDbCommand(); 
       command.Connection = connection; 
       command.CommandText = "INSERT INTO billing(g_name,g_surname,g_company,g_totalrate, g_paid, g_typepaid, info, u_add, u_tadd, g_ad, g_dd, g_amountofdays) VALUES('" + name + "','" + surname + "','" + company + "','" + txtbx8 + "', '" + txtbx9 + "', '" + cmbbx2 + "', '" + rtb + "', '" + label12.Text.ToString() + "', '" + this.dateTimePicker1.Value +"','"+textBox4.Text.ToString()+"','"+textBox5.Text.ToString()+"','"+textBox6.Text.ToString()+"')"; ; 
       command.ExecuteNonQuery(); 
       command.CommandType = CommandType.Text; 
       command.CommandText = "UPDATE guestreg SET g_paidstatus='Paid '"+txtbx9+"'' where g_name ='"+name+"' and g_status = '"+sts"'"; 

       command.Connection = connection; 
       connection.Open(); 
       command.ExecuteNonQuery(); 

     } 

この2つのコマンドを一緒に実行するにはどうすればよいですか。 プログラムは、最初のSQLコマンドを実行しますが、ない二番目の

+0

あなたは二 'command.Connection =接続を削除することができ、 connection.Open(); 'は、コマンドを変更してもう一度実行し、その後は接続を閉じることを忘れないでください。 –

+0

これはMySql、Sql Server、またはMS-Access用ですか? MySql/Sql Serverでは、2つのSQL文を使用して1つのコマンドを作成できます。これはアクセスでは不可能です。あなたの問題は、接続がすでに開いているときに開いている2番目の接続です。 – Steve

+0

@stuartd 2番目の 'ExecuteNonQuery'の前に' try {'の直後にもう1つあります。 –

答えて

3

あなたは、両方のコマンドにで表彰を実行できます。

try 
{ 
     connection.Open(); 

     MessageBox.Show("Payment approved."); 
     richTextBox1.Text = richTextBox1.Text + "The hotel received " + txtbx9 + " from this guest"; 
     string rtb = richTextBox1.Text.ToString(); 
     command.Connection = connection; 
     command.CommandText = "INSERT INTO billing(g_name,g_surname,g_company,g_totalrate, g_paid, g_typepaid, info, u_add, u_tadd, g_ad, g_dd, g_amountofdays) VALUES('" + name + "','" + surname + "','" + company + "','" + txtbx8 + "', '" + txtbx9 + "', '" + cmbbx2 + "', '" + rtb + "', '" + label12.Text.ToString() + "', '" + this.dateTimePicker1.Value +"','"+textBox4.Text.ToString()+"','"+textBox5.Text.ToString()+"','"+textBox6.Text.ToString()+"')"; 
     command.CommandText += "\nUPDATE guestreg SET g_paidstatus='Paid '"+txtbx9+"'' where g_name ='"+name+"' and g_status = '"+sts"'"; 
     command.ExecuteNonQuery(); 
} 

それとも、他の後にそれらを1つずつ実行します。

try 
{ 
     connection.Open(); 

     MessageBox.Show("Payment approved."); 
     richTextBox1.Text = richTextBox1.Text + "The hotel received " + txtbx9 + " from this guest"; 
     string rtb = richTextBox1.Text.ToString(); 
     command.Connection = connection; 
     command.CommandText = "INSERT INTO billing(g_name,g_surname,g_company,g_totalrate, g_paid, g_typepaid, info, u_add, u_tadd, g_ad, g_dd, g_amountofdays) VALUES('" + name + "','" + surname + "','" + company + "','" + txtbx8 + "', '" + txtbx9 + "', '" + cmbbx2 + "', '" + rtb + "', '" + label12.Text.ToString() + "', '" + this.dateTimePicker1.Value +"','"+textBox4.Text.ToString()+"','"+textBox5.Text.ToString()+"','"+textBox6.Text.ToString()+"')"; 
     command.ExecuteNonQuery(); 
     command.CommandText = "UPDATE guestreg SET g_paidstatus='Paid '"+txtbx9+"'' where g_name ='"+name+"' and g_status = '"+sts"'"; 
     command.ExecuteNonQuery(); 
} 

編集

スティーブが言及したように(そして彼は絶対に正しい)、パラメータを渡す必要がありますSqlParametersとなります。

try 
{ 
     connection.Open(); 

     MessageBox.Show("Payment approved."); 
     richTextBox1.Text = richTextBox1.Text + "The hotel received " + txtbx9 + " from this guest"; 
     string rtb = richTextBox1.Text.ToString(); 
     command.Connection = connection; 
     command.CommandText = "INSERT INTO billing(g_name,g_surname,g_company,g_totalrate, g_paid, g_typepaid, info, u_add, u_tadd, g_ad, g_dd, g_amountofdays) VALUES(@name,@surname,@company,@txtbx8,@txtbx9,@cmbbx2,@rtb,@label12Text,@dateTimePicker1Value,@textBox4Text,@textBox5Text,@textBox6Text')"; 
     command.Parameters.Add(new SqlParameter("@name",name)); 
     command.Parameters.Add(new SqlParameter("@surname",surname)); 
     command.Parameters.Add(new SqlParameter("@company",company)); 
     command.Parameters.Add(new SqlParameter("@txtbx8",txtbx8)); 
     command.Parameters.Add(new SqlParameter("@txtbx9",txtbx9)); 
     command.Parameters.Add(new SqlParameter("@cmbbx2",cmbbx2)); 
     command.Parameters.Add(new SqlParameter("@rtb",rtb)); 
     command.Parameters.Add(new SqlParameter("@label12Text",label12.Text.ToString())); 
     command.Parameters.Add(new SqlParameter("@dateTimePicker1Value",this.dateTimePicker1.Value.ToString())); 
     command.Parameters.Add(new SqlParameter("@textBox4Text",textBox4.Text.ToString())); 
     command.Parameters.Add(new SqlParameter("@textBox5Text",textBox5.Text.ToString())); 
     command.Parameters.Add(new SqlParameter("@textBox6Text",textBox6.Text.ToString())); 
     command.ExecuteNonQuery(); 
     command.CommandText = "UPDATE guestreg SET [email protected] where g_name [email protected] and g_status = @status"; 
     command.Parameters.Add(new SqlParameter("@paidStatus","Paid " + txtbx9)); 
     command.Parameters.Add(new SqlParameter("@name",name)); 
     command.Parameters.Add(new SqlParameter("@status",sts)); 
     command.ExecuteNonQuery(); 
} 
+0

これはMS-Accessでは動作しません(また、2つのコマンドテキスト間のセミコロンを忘れてしまいました) – Steve

+0

私はこれがAccess用であるかどうかわかりませんでした。 SQL Serverでは、コマンド間にセミコロンを使用する必要はありません。 –

+1

OPタグ付きデータベース3つ。彼/彼女が知っているのは – Steve

0

あなたがこれを使用することができます:「オニール」あなたのコードを壊さない(パラメータ名は、より良いかもしれない)のような予想外の入力という、利点は、SQLインジェクションに対して優れた安全性であり、あなたは確認することができます。コマンドを2回作成する必要があります。

private void button1_Click(object sender, EventArgs e) 
{ 
string txtbx9 = textBox9.Text.ToString(); 
string cmbbx2 = comboBox2.SelectedItem.ToString(); 
string name = textBox1.Text.ToString(); 
string surname = textBox2.Text.ToString(); 
string company = textBox3.Text.ToString(); 
string txtbx8 = textBox8.Text.ToString(); 
string sts = "In House"; 

    try 
    { 
     connection.Open(); 


     MessageBox.Show("Payment approved."); 
     richTextBox1.Text = richTextBox1.Text + "The hotel received " + txtbx9 + " from this guest"; 
      string rtb = richTextBox1.Text.ToString(); 

     OleDbCommand command = new OleDbCommand(); 

     command.Connection = connection; 
     command.CommandText = "INSERT INTO billing(g_name,g_surname,g_company,g_totalrate, g_paid, g_typepaid, info, u_add, u_tadd, g_ad, g_dd, g_amountofdays) VALUES('" + name + "','" + surname + "','" + company + "','" + txtbx8 + "', '" + txtbx9 + "', '" + cmbbx2 + "', '" + rtb + "', '" + label12.Text.ToString() + "', '" + this.dateTimePicker1.Value +"','"+textBox4.Text.ToString()+"','"+textBox5.Text.ToString()+"','"+textBox6.Text.ToString()+"')"; ; 
     command.ExecuteNonQuery(); 

     command = new OleDbCommand(); 
     command.Connection = connection; 
     command.CommandText = "UPDATE guestreg SET g_paidstatus='Paid '"+txtbx9+"'' where g_name ='"+name+"' and g_status = '"+sts"'"; 

     command.ExecuteNonQuery(); 

} 
} 
2

はそれを行うには多くの方法がありますが、私のための最も簡単な方法は、閉じて、再はこのようにそれを行うことです:

SqlCommand importCommand = new SqlCommand("select * from * ", connection); 
     SqlDataReader sqlDR = importCommand.ExecuteReader(); 
     int index = 0; 
     while (sqlDR.Read()) { //something } 
     sqlDR.Close(); 

     index = 0; 
     importCommand = new SqlCommand("select * from * ", connection); 
     sqlDR = importCommand.ExecuteReader(); 
     sqlDR.Close(); 
関連する問題