C#使用SqlCommand.Parameters更新表

我正在尝试使用SqlCommand更新MSSQL表,我认为这是我的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) 

UPDATE FROM语法无效(编辑:OP更正了这一点)。 问题也可能是“ text ”列。 text是SQL Server中的关键字,因为它是一种数据类型。 尝试在它周围放置括号。

 UPDATE yak_tickets SET email = @emailParam, subject = @subjectParam, [text] = @textParam, statusid = @statusIDParam, ticketClass = @ticketClassParam WHERE id = @ticketIDParam 

不得不使用if(!Page.IsPostBack)

几个问题:

  1. 这是否在回滚的事务中?
  2. 你确认@ticketIDParam匹配表上的一组行吗? 特别是如果它不仅仅是一个整数键
  3. 您是否更新没有副作用的行(即更新为相同的值)?
  4. 您能否为此查询提供paramaters.Add语句
  5. 桌子上是否有触发器或其他设置(我假设没有,因为你没有提到任何东西)。
  6. 你说你知道params工作正常,你能说你怎么validation这个吗? (剖析器,视觉检查等)。

听起来您的托管服务提供商限制了您的调试选项,迫使您以旧式方式执行此操作。 如果在更新后立即放置如下内容:

 ;SELECT @@ROWCOUNT 

然后执行ExecuteScalar而不是ExecuteNonQuery,看看SQL是否认为它更新了什么。