Sql UPDATE命令没有任何效果,只在网页中引发错误,控制台项目中的相同代码有效

时间:2010-11-02 13:45:00

标签: c# .net sql sqlclient

我有一个.NET 3.5 Web应用程序,它有一组处理实体持久性的类。 INSERT和SELECT准备的命令有效。但是,UPDATE命令永远不会工作(没有更新数据库记录),它永远不会抛出异常。它总是返回1,所以即使command.ExecuteNonQuery()也返回有效数量的受影响的行。

现在当我使用相同的实体类并在测试控制台应用程序中运行它时,预准备语句可以正常工作。

这真是令人沮丧和一个完整的节目塞子。我甚至在Ubuntu,Mac OS X和Windows上用Mono试过这个。所有执行相同(没有在Web应用程序中更新记录,插入工作和控制台应用程序工作)。

    public void Store()
    {
        SqlConnection conn = new SqlConnection(this.connection_string);
        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        int i = 0;
        if (this.id == 0)
        {
            // INSERT a new RECORD
            cmd.CommandText = "INSERT INTO [VtelCenter] ([CommonName],[Location]) VALUES (@commonname, " +
                "@location)";
            cmd.Parameters.Add("@commonname", SqlDbType.NVarChar, this.CommonName.Length);
            cmd.Parameters["@commonname"].Value = this.CommonName;
            cmd.Parameters.Add("@location", SqlDbType.NVarChar, this.Location.Length);
            cmd.Parameters["@location"].Value = this.Location;
        }
        else
        {
            // UPDATE an existing RECORD
            cmd.CommandText = "UPDATE [VtelCenter] SET [CommonName] = @commonname, [Location] = @location, " +
                "[Status] = @status WHERE [ID] = @id";
            //cmd.CommandText = "EXEC [dbo].[UpdateVtelCenter] @id, @commonname, @location, @status";
            cmd.Parameters.Add("@commonname", SqlDbType.NVarChar, this.commonName.Length);
            cmd.Parameters["@commonname"].Value = this.CommonName;
            cmd.Parameters.Add("@location", SqlDbType.NVarChar, this.Location.Length);
            cmd.Parameters["@location"].Value = this.Location;
            cmd.Parameters.Add("@status", SqlDbType.Int);
            cmd.Parameters["@status"].Value = (int) this.Status;
            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters["@id"].Value = this.Id;

        }
        cmd.Prepare();
        i = cmd.ExecuteNonQuery();            
        if (i != 1) 
            throw new Exception(string.Format("Incorrect number of records stored: {0}, should be 1.", i));
        conn.Close();
    }

1 个答案:

答案 0 :(得分:2)

有几点想帮助调试这个。

  1. 在VtelCenter表上查找可能正在改变预期结果的任何UPDATE触发器(AFTER或INSTEAD OF)。
  2. 在数据库服务器上运行SQL事件探查器跟踪,以便捕获在该端传入的查询。