2014-01-29 42 views
0

我試圖從文本框插入到表中的值,並從另一個表中檢索一個外鍵ID並插入它也。從文本框和從另一個表的外鍵插入值到表#C#

所以我有一個包含用戶ID一個用戶表,我想這個插入的營養日記,其中包括所有來自文本框的數據(即體重,身高,日期等)

我通過檢索成員Id使用會話來跟蹤用戶名(lblRegistered) 這裏是我的代碼:

SqlConnection con = new SqlConnection("path for my connection"); 
con.Open(); 

SqlCommand cmd = new SqlCommand("select COUNT(*)FROM Members where Username='" + lblRegistered.Text + "'", con); 

con.Close(); 

con.Open(); 

cmd.CommandText = "INSERT INTO Nutrition(Weight, Height, Bmi, Date, WaterIntake, CalorieIntake, MemberId) values ('" + txtWeight.Text + "','" + txtHeight.Text + "','" + txtBmi.Text + "','" + txtDate.Text + "','" + txtWater.Text + "','" + txtCalorie.Text + "', Select Users.UserId From Users where (Users.Username= '" + lblRegistered.Text + "'))"; 

cmd.ExecuteNonQuery(); 
cmd.Clone(); 
con.Close(); 
Response.Redirect("Success.aspx"); 

的誤差接近選擇用戶的一部分。

任何幫助將不勝感激!

+0

您在count和 –

+0

@ Selman22之間缺少一個空格這仍然是有效的SQL。我相信問題來自於嘗試在一個命令中執行「INSERT」和「SELECT」。你應該首先執行'SELECT',將它存儲在一個變量中,並將它傳遞給'INSERT'。 – TTeeple

+0

謝謝你們。我對此很陌生,所以我不確定我會怎麼做。那會包括使用執行標量嗎? 以下內容: SqlCommand cmd2 = new SqlCommand(「select MemberId FROM Members where Username ='」+ lblRegistered.Text +「'」,con); int UserId; UserId = Convert.ToInt32(cmd2.ExecuteScalar()); 然後在值中有'UserId'? – user3249809

回答

1

第一件事就是閱讀參數化的SQL查詢。您在那裏的代碼完全開放給SQL注入攻擊。

這是一個很好的資源:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

那麼對於這個問題,你使用存儲過程做的工作會更好。沿着線的東西:

CREATE PROCEDURE Nutrition_Insert 
    @weight varchar(10), 
    @height varchar(10), 
    @bmi varchar(10), 
    @date varchar(10), 
    @username varchar(10), 
    //etc for your fields 
AS BEGIN 

    DECLARE @memberId varchar(10) 
    SELECT @memberId = UserId From Users where Username = @username 

    INSERT INTO Nutrition(Weight, Height, Bmi, Date, WaterIntake, CalorieIntake, MemberId) 
    values (@weight, @height, @bmi, ....., @memberId) 

END 

注 - 我做了一些假設有,因爲我不知道你的數據類型,它們看起來都像琴絃,但不知道VARCHAR所使用的尺寸,我挑一個任意的價值。將(10)替換爲實際的字段大小。

如果您必須使用嵌入式SQL - 那麼這是您如何參數化它。我也修復了insert語句,從Member表中取出MemberId作爲插入的一部分。

 using (var conn = new SqlConnection("YOUR CONNECTION STRING")) 
     { 
      conn.Open(); 
      using (
       var cmd = new SqlCommand(
        "INSERT INTO Nutrition(...fields...) SELECT @Weight, @Height, @Bmi,...., Members.MemberId FROM Members WHERE Members.Username = @Username", conn) 
       ) 
      { 

       cmd.Parameters.AddWithValue("@Weight", txtWeight.Text); 
       cmd.Parameters.AddWithValue("@Height", txtHeight.Text); 
       ... 
       cmd.Parameters.AddWithValue("@Username", lblRegistered.Text); 

       cmd.ExecuteNonQuery(); 
      } 
      conn.Close(); 
     } 

您還會注意到using聲明。這將確保您的連接被清理乾淨。

希望有所幫助。

+0

謝謝理查德。我是新來的這個c#和.Would使用參數也是一個選項? 下面的代碼出現錯誤,但我想我可能不會太遠? cmd.CommandText =「INSERT INTO Nutrition(Weight,Height,Bmi,Date,MemberId)values('」+ txtWeight.Text +「','」+ txtHeight.Text +「','」+ txtBmi.Text + 「','」+ txtDate.Text +'「,@MemberId)」; cmd.Parameters.AddWithValue(「@ MemberId」,「選擇Members.MemberId來自Members.Username ='」+ lblRegistered.Text +''); 您可以使用參數,然後使用SQL語句檢索MemberId? – user3249809

+0

編輯我的答案給出一個嵌入式SQL示例 –

0

感謝Richard..that在問題上工作得很好。 我只是嘗試做不同的頁面上相同的技術,但這次將有2 where子句

var cmd = new SqlCommand("INSERT INTO AssignPlan(Reps, Sets, WeightOrTime, Date, MemberId, ExerciseId) Select @Reps, @Sets,@WeightOrTime,@Date, Members.MemberId From Members Where [email protected],ExerciseDisplay.ExerciseId From ExerciseDisplay Where [email protected]", conn) 

它顯示了從語法錯誤。這可以實現嗎?

+1

作爲理查德答案的評論,這將是更合適的。此外,這是完全相同的問題 - 看看你是否可以找出如何改變他已經寫的代碼你或者如果你只是需要幫助來計算出你的語法錯誤,可以問一個新的問題 - 或者更好的辦法是找到一個SQL驗證器 – brichins

+0

你正在進入更復雜的SQL,我相信我可以重寫那個做你想做的,但我認爲你真的需要考慮使用存儲過程來做到這一點,嵌入式SQL越複雜,第更難以維持。 –

相關問題