C#使用SqlCommand.Parameters更新表格

5

我正在尝试使用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)

这可能是一个愚蠢的问题,但是你是否将你的SQL命令分配给了你的SQL连接?sqlCommand.Connection = sqlConn; 我通常在构造函数中执行 sqlCommand = new SqlCommand(sqlConn); 如果你没有这样做,我认为它会抛出一个错误。 - GrayWizardx
是的,我使用的构造函数在末尾有它。 - skylerl
你的数据库中实际上使用了NVArchar字段还是只使用varchar? - GrayWizardx
5个回答

5

UPDATE FROM不是有效的语法(已经被编辑者更正)。问题也可能出在"text"列上。因为text是SQL Server中的关键字,所以它是一种数据类型。请尝试在它周围加上方括号。

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

哦,不过还是不能正常工作吗?我们能看到更多的代码吗? - womp
可能需要澄清一下 - 在UPDATE语句中可以使用FROM子句,例如 UPDATE t SET t.Field='Blah' FROM MyTable t WHERE t.Id = 1 - AdaTheDev
谢谢,Ada。我刚刚注意到他一开始就有UPDATE FROM,这是无效的。 - womp
@womp - 是的,我也想提到同样的事情。我知道你的意思,只是觉得其他人可能不知道 :) - AdaTheDev
我刚刚进行了一个快速测试,没有括号的文本在简单的上下文中可以工作,因此该语句似乎是有效的。你的参数或数据类型/长度肯定有问题。需要检查的一些事项包括:你的列是否足够长以容纳传递进来的参数,以及ID参数是否为空。 - womp
你能运行SQL分析器并观察命令执行吗?这至少可以告诉你错误所在。 - womp

2

必须使用if(!Page.IsPostBack)


1

几个问题:

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

1.) 不 2.) 是的,@ticketIDParam 良好无误,在其他方法中我已经使用过它了。 3.) 我正在更新可能已经设置为相同值的行,是的。 4.) 我把它们添加在上面了。 5.) 没有触发器。 6.) 这些参数通常是从我已经成功的方法中复制/粘贴而来的,不过有些需要做一些更改,所以可能会有一两个错误。 - skylerl
如果您可以获得分析器跟踪,您就可以准确地看到正在发送什么。并尝试在服务器上执行相同的命令(假设您有权限)。 - GrayWizardx
我希望我能这样做,但GoDaddy对此类访问非常限制。=/ - skylerl

0

看起来你的托管提供商限制了你的调试选项,迫使你以传统的方式进行。如果在更新后立即放置以下内容会怎样:

;SELECT @@ROWCOUNT

那么,不要使用ExecuteNonQuery,而是使用ExecuteScalar,看看SQL是否认为已经更新了任何内容。


0
我不知道自从你第一次问以来有没有改变,但这对我来说是有效的,例如:
var SchoolName = cmd.Parameters.AddWithValue("@SchoolName", school.SchoolName);
SchoolName.SqlDbType = SqlDbType.NVarChar;

在你的代码中,它是:
sqlCmd.Parameters.Add("@emailParam", SqlDbType.NVarChar);
sqlCmd.Parameters["@emailParam"].Value = ticketToBeSubmitted.getEmail();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接