从文本框和表格中将值插入表格从另一个表的外键C#

时间:2014-01-29 17:00:17

标签: c# sql-server

我试图从文本框插入表值并从另一个表中检索外键id并插入它。

所以我有一个包含UserId的用户表,我希望将其插入营养日记中,其中包含来自文本框的所有数据(即重量,高度,日期等)

我正在使用会话来检索MemberId以跟踪用户名(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");

错误接近选择用户部分。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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语句,将MembersId从Members表中拉出来作为插入的一部分。

        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语句。这样可以确保您的连接处于干净利落状态。

希望有所帮助。

答案 1 :(得分:0)

谢谢理查德......这个问题非常有效。 我只是想尝试在不同的页面上执行相同的技术,但这次它将有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 Members.Username=@name,ExerciseDisplay.ExerciseId From ExerciseDisplay Where ExerciseDisplay.ExerciseName=@Exercise", conn)

它显示语法错误。这可以实现吗?