2011-08-08 38 views
2

我有兩個表,一個用於存儲個人信息,一個用於存儲他的電話號碼,TBL -persons使用forgin鍵連接到tbl_phones表。如何插入兩個與sql相關的表?

我有一個表格插入到兩個表,這是功能

private void save() 
    { 
     SqlCommand cmd = new SqlCommand("insert into tbl_persons (name,address,fax,mobile,email,website) values (@name,@address,@fax,@mobile,@email,@website)" + "Select Scope_Identity()", conn); 
     cmd.CommandType = CommandType.Text; 

     cmd.Parameters.AddWithValue("@name", T_name.Text.Trim()); 
     cmd.Parameters.AddWithValue("@address", T_address.Text.Trim()); 
     cmd.Parameters.AddWithValue("@fax", T_fax.Text.Trim()); 
     cmd.Parameters.AddWithValue("@mobile", T_mobile.Text.Trim()); 
     cmd.Parameters.AddWithValue("@email", T_mobile.Text.Trim()); 
     cmd.Parameters.AddWithValue("@website", T_mobile.Text.Trim()); 

     int ID = Int32.Parse(cmd.ExecuteScalar().ToString()); 
     SqlCommand cmd2 = new SqlCommand("insert into tbl_phones (phone,person_id) values (@phone,@person)", conn); 
     cmd2.CommandType = CommandType.Text; 

     cmd2.Parameters.AddWithValue("@phone", T_phone.Text.Trim()); 
     cmd2.Parameters.AddWithValue("@person", ID); 

     int val = cmd.ExecuteNonQuery(); 
     int val2 = cmd2.ExecuteNonQuery(); 
     if (val > 0) 
     { 
      MessageBox.Show("تم إدخال البيانات بنجاح"+ID, "تم", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading); 
      resetFields(); 
      GetDate(); 
     } 
    } 

但錯誤是人的信息被插入兩次和電話號碼被插入一個一個的時候,是什麼錯誤 ?

回答

6

您正在執行兩次cmd中的命令。一個是在這裏:

int ID = Int32.Parse(cmd.ExecuteScalar().ToString()); 

在這裏,其他:

int val = cmd.ExecuteNonQuery(); 

兩個指令(cmd.ExecuteScalar()cmd.ExecuteNonQuery())運行命令。確保你只有其中一個(可能是第一個,但你是你的邏輯的所有者,所以這是你的呼叫)。

3

你看上去執行cmd兩次。

一旦在這裏:

     \/ 
int ID = Int32.Parse(cmd.ExecuteScalar().ToString()); 
         /\ 

和曾經在這裏:

  \/ 
int val = cmd.ExecuteNonQuery(); 
      /\ 
0

的問題是,您所呼叫cmd.ExecuteNonQuery兩次!

int ID = Int32.Parse(cmd.ExecuteScalar().ToString()); 

然後....

int val = cmd.ExecuteNonQuery(); 

因此,將2條

+0

的ExecuteScalar()是相同的的ExecuteNonQuery();? – amer

+0

@amer是,ExcecuteScalar返回結果集中返回的第一行的第一列。 ExecuteNonQuery返回受SQL命令影響的行數。所以是的,從某種意義上說,它們是一樣的。 – Icarus

0

您正在執行的第一個查詢兩次:

int ID = Int32.Parse(cmd.ExecuteScalar().ToString()); 

int val = cmd.ExecuteNonQuery(); 

刪除第二個。

+0

opps代碼不會插入tbl_phones:S爲什麼? – amer

+0

@amer你刪除了哪一行?你應該刪除第二個,因爲如果你刪除第一個,你將不會從個人身份獲得身份。 – AJC

+0

@amer另外,我不確定,但爲了安全起見,您需要添加一個「;」在你的第一個查詢中,像這樣:「@website);」 +「選擇」... – AJC