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)
几个问题:
- 这是否在回滚的事务中?
- 你确认@ticketIDParam匹配表上的一组行吗? 特别是如果它不仅仅是一个整数键
- 您是否更新没有副作用的行(即更新为相同的值)?
- 您能否为此查询提供paramaters.Add语句
- 桌子上是否有触发器或其他设置(我假设没有,因为你没有提到任何东西)。
- 你说你知道params工作正常,你能说你怎么validation这个吗? (剖析器,视觉检查等)。
听起来您的托管服务提供商限制了您的调试选项,迫使您以旧式方式执行此操作。 如果在更新后立即放置如下内容:
;SELECT @@ROWCOUNT
然后执行ExecuteScalar而不是ExecuteNonQuery,看看SQL是否认为它更新了什么。