[英]Updating SQL Server database with values from textboxes using stored procedure
我們有一個aspx頁面,其中有多個文本框。 我們要獲取輸入到這些文本框中的數據,並使用它們更新我們的SQL Server數據庫。 但是,如果任何文本框都留為空白,那么我們希望數據保持原樣。
我們編寫了以下存儲過程來執行更新:
ALTER PROCEDURE pr_updateBooking
(
@BookingRef INT,
@BoatID INT,
@LeadPassenger INT,
@StartDate Date,
@Duration INT,
@Pets INT,
@Children INT,
@Passengers INT,
@SpecialRequests VARCHAR(255),
@BalanceOutstanding NUMERIC(12, 2),
@Comments VARCHAR(50)
)
AS
DECLARE @error INT
UPDATE BookingView
SET Balance_Outstanding = @BalanceOutstanding,
Comments = @Comments
WHERE Booking_Ref = @BookingRef
UPDATE vBoat_Booking
SET BoatID = @BoatID, Lead_PassengerID = @LeadPassenger,
Start_Date = @StartDate, Duration_In_hours = @Duration,
Number_of_pets = @Pets, Number_of_children = @Children,
Number_of_passengers = @Passengers
WHERE Booking_Ref = @BookingRef
SET @error = @@error
IF @error <> 0
RETURN 99
ELSE
RETURN 0
這是在我們的aspx頁面上單擊“提交”按鈕時將運行的C#代碼
protected void buttonClicked(object sender, EventArgs e)
{
string CS = ConfigurationManager.ConnectionStrings["G4StowawaysConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(CS);
conn.Open();
SqlCommand cmd2 = new SqlCommand("pr_updateBooking", conn);
cmd2.CommandType = CommandType.StoredProcedure;
// add our parameters to our command object
cmd2.Parameters.Add("@BookingRef", SqlDbType.Int).Value = BookingRef.Text;
cmd2.Parameters.Add("@BoatID", SqlDbType.Int).Value = BoatID.Text;
cmd2.Parameters.Add("@LeadPassenger", SqlDbType.Int).Value = LeadPassenger.Text;
cmd2.Parameters.Add("@StartDate", SqlDbType.Date).Value = StartDate.Text;
cmd2.Parameters.Add("@Duration", SqlDbType.Money).Value = Duration.Text;
cmd2.Parameters.Add("@Pets", SqlDbType.Int).Value = Pets.Text;
cmd2.Parameters.Add("@Children", SqlDbType.Int).Value = Children.Text;
cmd2.Parameters.Add("@Passengers", SqlDbType.Int).Value = Passengers.Text;
cmd2.Parameters.Add("@SpecialRequests", SqlDbType.VarChar, 255).Value = SpecialRequests.Text;
cmd2.Parameters.Add("@BalanceOutstanding", SqlDbType.Int).Value = BalanceOutstanding.Text;
cmd2.Parameters.Add("@Comments", SqlDbType.VarChar, 50).Value = Comments.Text;
try
{
if (cmd2.Connection.State == ConnectionState.Closed)
{
cmd2.Connection.Open();
}
cmd2.ExecuteNonQuery();
}
catch (Exception)
{
}
finally
{
cmd2.Connection.Close();
}
}
當我們運行頁面時,沒有錯誤消息,但是數據沒有出現在數據庫中!
該存儲過程將不接受參數值中的空值,因此您需要進行一些檢查-也許可以。 您確實需要在Catch {}塊中放入一些代碼,以查看該過程是否返回錯誤。
我不知道您要在哪里阻止更新。 所出現的問題應在用戶界面中解決。 如果任何條目為空,則不允許提交。 簡單。
如果希望該過程避免執行更新,則應將所有參數設置為允許空值。 然后在允許更新之前檢查是否有任何空值。 您可以拋出用戶定義的錯誤或99(按設計)。 此方法還要求您僅在文本框不為空時設置參數值。
您的應用程序中有幾個問題。
1.如注釋中所述,使用int result = cmd.ExecuteNonQuery()
返回值(0或99)。 實際上這還不夠。
2.檢查您的表模式以查看關注字段是否allow null
。
3.在您的存儲過程中使用事務。
...
AS
--DECLARE @error INT --no need
begin transaction
begin try
UPDATE BookingView
SET Balance_Outstanding = @BalanceOutstanding, Comments = @Comments
WHERE Booking_Ref = @BookingRef
UPDATE vBoat_Booking
SET BoatID = @BoatID, Lead_PassengerID = @LeadPassenger, Start_Date = @StartDate, Duration_In_hours = @Duration, Number_of_pets = @Pets,
Number_of_children = @Children, Number_of_passengers = @Passengers
WHERE Booking_Ref = @BookingRef
commit
end try
begin catch
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
rollback
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
)
end catch
--SET @error = @@error
--IF @error <> 0 RETURN 99
--ELSE RETURN 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.