我的网站上有一个Q和A页面,显示从我的数据库中的问题表中提取的问题。问题下面是两个文本框 - 一个用于人名,另一个用于答案,将被插入答案表。答案表上有一个FK questionID,这就是我被困住的地方。如何在我的代码中编写答案表的脚本,以便它使用问题表中的那个问题ID?
这是我到目前为止所做的:
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();
}
}
%%是我需要修复的。我正在考虑使用String变量,但后来我仍然不知道该数据类型应该使用什么。
答案 0 :(得分:0)
您需要从问题表中执行get Query(Select Statement)以检索Question Id,然后执行插入操作。
另外,使用参数字符串,不要连接,你的代码可能会被注入恶意行为,可能会删除你的数据库表!
答案 1 :(得分:0)
您需要将问题的ID存储在隐藏字段中,并在insert语句中使用内部选择来引用问题的ID。
隐藏字段的设置如下:
<input type="hidden" id="questionId" value="questionId" />
然后:
SqlCommand cmd = new SqlCommand("INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
"VALUES (questionId.Value, '" + txtName.Text + "', '" + txtAnswer.Text + "')");
内部选择将采用
的形式insert into table ((select id from questiontable where question = [the question text]), 'name', 'answer')
答案 2 :(得分:0)
您需要创建一个int QuestionID
变量来保存当前QuestionID
。只需在用户更改问题时进行更改即可。您可以将其存储在Session
。
附注:我建议参数化txtName.Text
和txtAnswer.Text
以避免SQL注入。
答案 3 :(得分:0)
当您收到数据库的问题时,也要获取Id并将其存储在某处。
另一方面,您的代码对SQL注入是开放的。使用参数来存储文本框中的值,如下所示:
SqlParameter param = new SqlParameter("@Name", SqlDbType.VarChar);
param.Value = txtName.Text;
cmd.Parameters.Add(param);
答案 4 :(得分:0)
所以你的控件是 Gridview ,可能就是这种情况..尝试一下。
protected void myRowCommand(object sender, GridViewCommandEventArgs e)
{
String connectionString = "Server=root;Database=test;User=name;Password=test;";
GridViewRow row = this.GridView1.SelectedRow;
int EntryID = row.RowIndex;
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("INSERT INTO Answers (QuestionID, Answer_Name, Answer)" +
"VALUES (EntryID, '" + txtName.Text + "', '" + txtAnswer.Text + "')");
cmd.Connection = conn;
conn.Open();
cmd.ExecuteScalar().ToString();
}
}
}
&#13;
答案 5 :(得分:0)
当您获取问题ID时,您应该将其存储到变量中,以便在插入命令时重复使用它。
像:
SELECT Id, /*And anything else you need*/ FROM QUESTION
并将其存储在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();
}
}