C# 在部件中向数据库添加数据(asp.net)

C# 在部件中向数据库添加数据(asp.net),c#,sql,asp.net,sql-server,tsql,C#,Sql,Asp.net,Sql Server,Tsql,我有几个页面用于预订,每个页面都保存数据。例如,第一页将目的地添加到数据库中,第二页选择乘客数量 我有一张桌子来存储所有这些: CREATE TABLE [dbo].[Transactions] ( [cardNumber ] NCHAR (10) NULL, [Cost] NCHAR (10) NULL, [Passengers] NCHAR (10) NULL, [Destination] NCHAR (10) NULL ); 在目标页面上,我使用以下代码将目标输入数据库:

我有几个页面用于预订,每个页面都保存数据。例如,第一页将目的地添加到数据库中,第二页选择乘客数量

我有一张桌子来存储所有这些:

CREATE TABLE [dbo].[Transactions] (
[cardNumber ] NCHAR (10) NULL,
[Cost]        NCHAR (10) NULL,
[Passengers]  NCHAR (10) NULL,
[Destination] NCHAR (10) NULL
);
在目标页面上,我使用以下代码将目标输入数据库:

protected void Button2_Click1(object sender, EventArgs e)
{
    try
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString);

        conn.Open();
        string insert = "insert into Transactions (Destination) values (@Destination)";

        SqlCommand com = new SqlCommand(insert, conn);

        com.Parameters.AddWithValue("@Destination", DropDownList1.SelectedItem);

        com.ExecuteNonQuery();
        conn.Close();
    }
    catch (Exception ex)
    {
        Response.Write("Error: " + ex.ToString()); 
    }

    Response.Redirect("Booking.aspx"); 
}
在下一页,我有相对相同的代码来输入乘客数量:

protected void Button2_Click(object sender, EventArgs e)
{
    try
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString);

        conn.Open();

        string insert = "insert into Transactions (Passengers) values (@Passengers)";

        SqlCommand com = new SqlCommand(insert, conn);
        com.Parameters.AddWithValue("@Passengers", DropDownList1.SelectedItem);

        com.ExecuteNonQuery();
        conn.Close();
    }
    catch(Exception ex)
    {
        Response.Write("Error: " + ex.ToString());
    }

    Response.Redirect("Payment.aspx");

}
但在执行此操作后,没有数据输入数据库。如果有人知道我可以一次一个数据输入数据库,请让我知道

如果不能这样做,有更好的方法再次这样做,请让我知道


谢谢大家抽出时间。

您的表中应该有一个专用的主键列,我建议使用自动递增整数

CREATE TABLE [dbo].[Transactions]
(
    [ID]          INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    [CardNumber]  NCHAR (10) NULL,
    [Cost]        NCHAR (10) NULL,
    [Passengers]  NCHAR (10) NULL,
    [Destination] NCHAR (10) NULL
);
然后,使用存储过程,而不是临时SQL

CREATE PROCEDURE TransactionSave
(
    @ID int = null,
    @CardNumber nchar(10) = null,
    @Cost nchar(10) = null,
    @Passengers nchar(10) = null,
    @Destination nchar(10) = null
)
AS
BEGIN

DECLARE @ExistingID int
SELECT @ExistingID = ID FROM Transaction WHERE ID = @ID

IF @ExistingID is null
BEGIN
     --Insert
     INSERT INTO Transaction (CardNumber, Cost, Passengers, Destination)
     VALUES (@CardNumber, @Cost, @Passengers, @Destination)

     SELECT CAST(SCOPE_IDENTITY() AS INT) AS 'TransactionID'
END
ELSE
BEGIN
     --Update
     UPDATE Transaction
     SET
         CardNumber = ISNULL(@CardNumber, CardNumber),
         Cost = ISNULL(@Cost, Cost),
         Passengers = ISNULL(@Passengers, Passengers),
         Destination = ISNULL(@Destination, Destination),
     WHERE ID = @ExistingID

     SELECT @ExistingID AS 'TransactionID'
END

END
然后,在代码隐藏中,您需要保留正在处理的事务的ID值,以确保您正在更新正确的行:

protected void Button2_Click(object sender, EventArgs e)
{
    int transactionID = hfID.Value;

    try
    {
        using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand("TransactionSave", conn);

            cmd.Parameters.AddWithValue("@ID", transactionID);
            cmd.Parameters.AddWithValue("@Passengers", DropDownList1.SelectedValue);

            transactionID = cmd.ExecuteScalar();
            hfID.Value = transactionID;
        }
    }
    catch(Exception ex)
    {
        Response.Write("Error: " + ex.ToString());
    }
}

移动Response.RedirectPayment.aspx;控制室关闭后;如果抛出en exception,Response.Write将被重定向隐藏。当您运行代码并使用断点时,还会发生什么情况呢?请使用{另外,试着发出一个提交,看看这是否有帮助。你也知道,点击按钮会导致回发。每个页面的页面加载代码是什么样子的。我会直截了当地告诉你,我不知道这一半的意思是什么。不过页面加载无效是空的,感谢Kalten,我已经这样做了,因此在出现错误时它不会重定向。在调试器中,DropDownList1.SelectedItem的值是多少。这里有一些提示查看以下内容,您需要需要com.Parameters所需的文本值。AddWithValue@Passengers,DropDownList1.SelectedItem.Text;dropdownlist的选项用于第一个页面,例如电影院、bowlplex等,只是示例数据。第二页的选项只是数字,但它们是文本格式,所以,一、二、三等。我将尝试将所选项目更改为文本,看看发生了什么。谢谢,我现在就尝试一下,看看发生了什么。给我一点时间先通读一遍,这样我就知道发生了什么:听起来不错。简而言之,你需要保留一些东西来表示你正在使用的“哪一行”。行的ID由该进程返回,您可以使用cmd.ExecuteScalar捕获它。然后,一旦输入了必要的信息,您可能会想要重定向;“正常路线”是让UI上的表单需要完整的“行”数据,然后单击一个按钮并一次执行行的插入。然而,“非典型”并不意味着“不可能”。它很有效。干杯都德:有一些错误,诸如此类,但在谷歌工作了一段时间后,它就完成了。非常感谢:这里显示的代码有任何错误吗?它确实假设您添加了一个HiddenField hfID。如果你还有任何问题,请告诉我。