C# 如何使用外键对插入进行编码?
我的网站上有一个Q和一个页面,其中显示了从数据库中的问题表中提取的问题。问题下方有两个文本框,一个用于输入姓名,另一个用于输入答案表中的答案。答案表上有一个FK问题ID,这就是我被卡住的地方。如何在代码中为答案表编写脚本,以便它使用问题表中的问号 这就是我到目前为止所做的:C# 如何使用外键对插入进行编码?,c#,asp.net,C#,Asp.net,我的网站上有一个Q和一个页面,其中显示了从数据库中的问题表中提取的问题。问题下方有两个文本框,一个用于输入姓名,另一个用于输入答案表中的答案。答案表上有一个FK问题ID,这就是我被卡住的地方。如何在代码中为答案表编写脚本,以便它使用问题表中的问号 这就是我到目前为止所做的: protected void btnSubmitAnswer_onClick(object sender, EventArgs e) { String connectionString = "Server=root
protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
String connectionString = "Server=root;Database=test;User=name;Password=test;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
"VALUES (%%, '" + txtName.Text + "', '" + txtAnswer.Text + "')");
cmd.Connection = conn;
conn.Open();
cmd.ExecuteScalar().ToString();
}
}
%%是我需要修复的。我正在考虑使用一个字符串变量,但是我仍然不知道该使用什么数据类型。您需要从问题表中执行get Query Select语句来检索问题Id,然后执行插入操作
另外,使用参数字符串,不要连接,您的代码可能会被注入恶意行为,可能会删除您的数据库表 您需要将问题的id存储在一个隐藏字段中,并引用该字段,否则在insert语句中使用内部select来检索问题的id 隐藏字段的设置如下所示:
<input type="hidden" id="questionId" value="questionId" />
内部选择将以
insert into table ((select id from questiontable where question = [the question text]), 'name', 'answer')
您需要创建一个int QuestionID变量来保存当前的QuestionID。当用户更改问题时,只需更改它。您可以将其存储在会话中
旁注:我建议参数化txtName.Text和txtAnswer.Text,以避免SQL注入。在获取数据库问题时,也获取Id并将其存储在某处 另一方面,您的代码对SQL注入是开放的。使用参数存储文本框中的值,如下所示:
SqlParameter param = new SqlParameter("@Name", SqlDbType.VarChar);
param.Value = txtName.Text;
cmd.Parameters.Add(param);
因此,您的控件是Gridview,可能是这样。。试试看
受保护的无效myRowCommandobject发送方GridViewCommandEventArgs e
{
字符串连接字符串=Server=root;数据库=test;用户=name;密码=test;;
GridViewRow行=this.GridView1.SelectedRow;
int EntryID=row.RowIndex;
使用SqlConnection conn=新的SqlConnectionconnectionString
{
SqlCommand cmd=new-SqlCommandINSERT-INTO-Answers-QuestionID、Answer\u-Name、Answer+
值EntryID,“+txtName.Text+”,“+txtAnswer.Text+”;
cmd.Connection=conn;
康涅狄格开放大学;
cmd.ExecuteScalar.ToString;
}
}
} 获取问题Id时,应将其存储到变量中,以便在插入命令时重用它 比如: 并将其存储在类似Int32 QuestionId的变量中 此外,为了完整性起见,不要连接SQL字符串,这会使代码易受攻击,而应使用SQL参数
protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
String connectionString = "Server=root;Database=test;User=name;Password=test;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(
"INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
"VALUES (@prmQuestionId, @prmAnswerName, @prmAnswer)");
cmd.Parameters.Add(new SqlParameter("@prmQuestionId", QuestionId/*HERE INSERT THE ID VALUE OF THE FETCHED QUESTION*/));
cmd.Parameters.Add(new SqlParameter("@prmAnswerName", txtName.Text));
cmd.Parameters.Add(new SqlParameter("@prmAnswer", txtAnswer.Text));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteScalar().ToString();
}
}
您对SQL注入非常开放,fyi网站中的问题是如何组织的?您提供的代码不足以说明您可以从哪里获得您的问题ID。你是说它显示了一个从问题表中提取的问题——那么为什么不不仅提取问题文本呢。但也要识别并使用它?你的模型是什么,目前你允许一个问题有多个答案。一对多,正确吗?是的,正确,同一个问题可以有多个答案。感谢@AndyKorneyev删除了问题并发表了评论感谢警告,尽管我知道这是真的-我不担心我的用户会这样做。我使用网格视图来显示问题。这实际上也非常有用,谢谢:谢谢你的预防措施。谢谢你的帮助,这将是最大的帮助
SELECT Id, /*And anything else you need*/ FROM QUESTION
protected void btnSubmitAnswer_onClick(object sender, EventArgs e)
{
String connectionString = "Server=root;Database=test;User=name;Password=test;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(
"INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
"VALUES (@prmQuestionId, @prmAnswerName, @prmAnswer)");
cmd.Parameters.Add(new SqlParameter("@prmQuestionId", QuestionId/*HERE INSERT THE ID VALUE OF THE FETCHED QUESTION*/));
cmd.Parameters.Add(new SqlParameter("@prmAnswerName", txtName.Text));
cmd.Parameters.Add(new SqlParameter("@prmAnswer", txtAnswer.Text));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteScalar().ToString();
}
}