我正在制作课程预订网站,并且无法创建按钮。 我想客户将两个详细信息会话插入两个文本框,会话类型"类"或"研讨会"和日期&时间,他们将能够看到DataGridView显示的信息。
一旦他们击中" Reserve"按钮按钮将运行一个查询,它将所选会话从Session表添加到Reservation表。但是我的代码执行时没有错误,但没有更新" Reservation"表
这是我的代码:
OleDbConnection myConnection = GetConnection();
OleDbCommand cmd = myConnection.CreateCommand();
string query = "select COUNT(*) from [Yoga-Session] where [session type] = '" + txt_type.Text + "' and duration = '" + txt_datetime.Text + "';";
OleDbCommand command = new OleDbCommand(query, myConnection);
myConnection.Open();
int rows1 = (Int32)command.ExecuteScalar();
if (rows1 >= 1)
{
cmd = new OleDbCommand("Select session_id from [yoga-session] where [session type] = '" + txt_type.Text + "' and duration = '" + txt_datetime.Text +"';",myConnection);
int classId = (Int32)command.ExecuteScalar();
cmd = new OleDbCommand("select client_id from client where name = '" + Session["[name]"] + "';", myConnection);
int clientID = (Int32)command.ExecuteScalar();
string query1 = "insert into reservation (session_id, client_id, client_name) values ('" + classId + "','" + clientID + "','" + Session["[name]"].ToString() + "');";
cmd = new OleDbCommand(query1, myConnection);
cmd.ExecuteNonQuery();
Response.Write("Reservation successful");
Response.Redirect("reservation.aspx");
myConnection.Close();
}
}
}
答案 0 :(得分:1)
int classId = (Int32)cmd.ExecuteNonQuery();
int clientID = (Int32)cmd.ExecuteNonQuery();
您需要使用cmd.ExecuteScalar()
来获取session_id
和client_id
值。 ExecuteNonQuery
不会返回受SQL查询影响的行。
同时看看@Sherantha指出的内容。
答案 1 :(得分:0)
ExecuteNonQuery()
不适用于SELECT命令。要从SELECT命令获取字段值,我们需要使用ExecuteScalar()
。
尝试替换;
int rows1 = (Int32)command.ExecuteScalar();
答案 2 :(得分:0)
您应该使用query1而不是查询。
string query1 = "insert into reservation (session_id, client_id, client_name) values ('" + classId + "','" + clientID + "','" + Session["[name]"].ToString() + "');";
cmd = new OleDbCommand(query1, myConnection);// not query but query1
cmd.ExecuteNonQuery();
Response.Write("Reservation successful");
PS:使用sql数据阅读器选择数据。
cmd = new OleDbCommand("Select session_id from [yoga-session] where [session type] = '" + txt_type.Text + "' and duration = '" + txt_datetime.Text +"';",myConnection);
SqlDataReader rdr = cmd.ExecuteReader();
int classId = 0;
while (rdr.Read())
{
clientID = Convert.ToInt32(rdr["session_id"]);
}
答案 3 :(得分:0)
在我撰写真正的答案(因为我没有代表评论)之前,只需要一小部分。
首先:使用准备好的陈述。它们极大地帮助减少了输入SQL查询的错误,以及在实际情况下防止SQL注入攻击的方法。
其次:虽然大多数数据库类型并不真正需要,但建议您的代码中的命名约定严格统一。
除此之外,我现在会得到真正的答案。
查看代码,我假设classID
和clientID
是整数,但在您的代码中,由于''字符,它们看起来像是被解析为字符串。插入整数时不要使用字符。
编辑:[会话类型]是[session_type]吗?