我试图从文本框插入表值并从另一个表中检索外键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");
错误接近选择用户部分。
非常感谢任何帮助!
答案 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)
它显示语法错误。这可以实现吗?