预约按钮

时间:2015-12-15 04:42:08

标签: c# sql ms-access

我正在制作课程预订网站,并且无法创建按钮。 我想客户将两个详细信息会话插入两个文本框,会话类型"类"或"研讨会"和日期&时间,他们将能够看到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();
    }
}
}

4 个答案:

答案 0 :(得分:1)

int classId = (Int32)cmd.ExecuteNonQuery();
int clientID = (Int32)cmd.ExecuteNonQuery();

您需要使用cmd.ExecuteScalar()来获取session_idclient_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注入攻击的方法。

其次:虽然大多数数据库类型并不真正需要,但建议您的代码中的命名约定严格统一。

除此之外,我现在会得到真正的答案。

查看代码,我假设classIDclientID是整数,但在您的代码中,由于''字符,它们看起来像是被解析为字符串。插入整数时不要使用字符。

编辑:[会话类型]是[session_type]吗?