这个问题已经在这里有了答案 :
11年前关闭。
可能重复: 使用SqlCommand.Parameters的C#更新表
可能重复:
使用SqlCommand.Parameters的C#更新表
我正在尝试使用SqlCommand更新SQL Server表,我认为这是我的T-SQL的语法错误,但是到目前为止,这是我所拥有的:
SqlCommand sqlCmd = new SqlCommand( "UPDATE yak_tickets SET email = @emailParam, subject = @subjectParam, text = @textParam, statusid = @statusIDParam, ticketClass = @ticketClassParam WHERE id = @ticketIDParam", sqlConn);
参数正在按应有的方式工作,但是,当我运行代码时,表永远不会更新。任何帮助将不胜感激=)
这是其余的代码:
#region Parameters /* Parameters */ sqlCmd.Parameters.Add("@ticketIDParam", SqlDbType.BigInt); sqlCmd.Parameters["@ticketIDParam"].Value = ticketID; sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar); sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail(); sqlCmd.Parameters.Add("@subjectParam", SqlDbType.NVarChar); sqlCmd.Parameters["@subjectParam"].Value = ticketToBeSubmitted.getSubject(); sqlCmd.Parameters.Add("@textParam", SqlDbType.Text); sqlCmd.Parameters["@textParam"].Value = ticketToBeSubmitted.getTicketContent(); sqlCmd.Parameters.Add("@statusIDParam", SqlDbType.NVarChar); sqlCmd.Parameters["@statusIDParam"].Value = ticketToBeSubmitted.getStatus(); sqlCmd.Parameters.Add("@ticketClassParam", SqlDbType.NVarChar); sqlCmd.Parameters["@ticketClassParam"].Value = ticketToBeSubmitted.getTicketClass(); #endregion #region Try/Catch/Finally /* Try/Catch/Finally */ try { sqlConn.Open(); sqlCmd.ExecuteNonQuery(); } catch (SqlException sqlEx) { sqlErrorLabel.Text = sqlEx.ToString(); sqlErrorLabel.ForeColor = System.Drawing.Color.Red; } finally { sqlConn.Close(); }
以及方法的签名:
public static void updateTicketInDatabase(Ticket ticketToBeSubmitted, Label sqlErrorLabel, int ticketID)
我已经通过探查器运行了它,下面是它的作用。
Page Loads -> Audit Login: -- Sets a bunch of stuff (irrelevant) SQL:BatchStarting -- SELECT * from yak_tickets SQL:BatchCompleted -- SELECT * from yak_tickets Audit Logout Button Click Event -> RPC:Completed: -- exec sp_reset_connection Audit Login: -- Sets some more stuff SQL:BatchStarting -- SELECT * from yak_tickets SQL:BatchCompleted -- SELECT * from yak_tickets
这是表单文件的背后代码。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using YakStudios_Support.Includes; namespace YakStudios_Support.ys_admin { public partial class UpdateTicket : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int ticketID = Convert.ToInt32(Request.QueryString["ticketID"]); // Grabs the ?ticketid number from the URL Ticket ticketBeingUpdated = TicketDatabase.selectTicketFromDatabase(sqlErrorLabel, 1); // Creates a new Ticket object to be used by the form to populate the text boxes /* Form Field Population */ // Email emailTxt.Text = ticketBeingUpdated.getEmail(); // Date Submitted dateSubText.Text = ticketBeingUpdated.getDateSubmitted().ToString(); // Ticket Class classDropDown.SelectedValue = ticketBeingUpdated.getTicketClass(); // Ticket Status statusDrop.SelectedValue = ticketBeingUpdated.getStatus(); // Subject subjectTxt.Text = ticketBeingUpdated.getSubject(); // Text textTxt.Text = ticketBeingUpdated.getTicketContent(); } protected void editBtn_Click(object sender, EventArgs e) { emailTxt.Enabled = true; dateSubText.Enabled = true; classDropDown.Enabled = true; statusDrop.Enabled = true; subjectTxt.Enabled = true; textTxt.Enabled = true; } protected void submitBtn_Click(object sender, EventArgs e) { int ticketID = Convert.ToInt32(Request.QueryString["ticketID"]); // Grabs the ?ticketid number from the URL DateTime convertedDate = Convert.ToDateTime(dateSubText.Text); Ticket ticketUpdated = new Ticket(emailTxt.Text, convertedDate, subjectTxt.Text, textTxt.Text, statusDrop.SelectedValue, classDropDown.SelectedValue); //Ticket ticketUpdated = new Ticket(emailTxt.Text, subjectTxt.Text, textTxt.Text, classDropDown.SelectedValue); Response.Write(TicketDatabase.updateTicketInDatabase(ticketUpdated, sqlErrorLabel, 1)); //Response.Redirect("ticketqueue.aspx"); } } }
在我看来,它正在执行的是再次运行我的select方法,这是页面加载时应该执行的操作。这是由刷新页面的按钮引起的吗?
在ExecuteNonQuery处添加一个断点,检查sqlCommand对象,使用sqlcommand查看参数,并确保将TicketId设置为您期望的值,因为更新是由ticketId驱动的,因此请确保其设置正确,或尝试直接在SQL Server上直接运行TSQL等效项,我猜是没有设置ticketId变量,乍一看代码看起来还不错。