2016-03-17 81 views
-2

我有幾頁預訂和每頁保存數據。例如,第一頁將目的地添加到數據庫,第二頁選擇乘客數量。將數據添加到數據庫的部分(asp.net)

我有一個表來存儲所有這一切:

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"); 

} 

但做完這個沒有d ata進入數據庫。如果有人知道我可以一次將數據輸入數據庫,請告訴我。

如果不能這樣做,並有一個更好的方式做到這一點,請讓我知道。

謝謝大家的時間。

+0

移動'響應。 Redirect(「Payment.aspx」);'conn.Close();'之後''如果拋出異常,'Response.Write'將被重定向隱藏。 – Kalten

+0

當您運行代碼並使用斷點alsorefactor Sql對象並將它們包裝在'using(){}'時,會發生什麼情況也會嘗試發出'Commit'並查看這是否也有助於您意識到單擊此按鈕會導致' PostBack「每頁都有什麼」Page_Load「代碼 – MethodMan

+0

我對你很直率,我不知道這些內容的一半是什麼意思。頁面加載void是空的,但感謝Kalten我已經這樣做了,所以當出現錯誤時它不會重定向。 – ceefax12

回答

0

你應該在你的表上有一個專用主​​鍵列,我推薦一個自動增量整數。

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()); 
    } 
} 
+0

單行謝謝,我現在就試試看看是什麼發生給我一段時間通讀第一,但我知道發生了什麼:) – ceefax12

+0

聽起來不錯。簡短的故事是,你需要保留一些東西來表示你正在使用的「哪一行」。該行的ID由該proc返回,並且可以使用'cmd.ExecuteScalar()'捕獲它。然後,一旦輸入必要的信息,您可能會希望重定向。 – Ehryk

+0

請注意,這種方法有點不典型; '正常路線'是要讓用戶界面上的表單需要完整的「行」數據,然後單擊一個按鈕並一次執行該行的插入。然而,「非典型」並不意味着「不可能」。 – Ehryk