C# MS SQL可以';t更新表

C# MS SQL可以';t更新表,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我有一个单列表来记录访问量。在Global.asax.cs中,我试图在application_start内将该值增加1,但该字段没有得到更新。我没有例外,但受影响的行数始终为零 我在SSMS中尝试了相同的简单查询,得到了相同的结果:0行受影响。 该表中有一个int列,名为NumVisits。 这是Global.asax.cs中应用程序_Start的一部分: Application.Lock(); int iNumVisits = SomeClass.GetNumVisits(); SomeCla

我有一个单列表来记录访问量。在Global.asax.cs中,我试图在application_start内将该值增加1,但该字段没有得到更新。我没有例外,但受影响的行数始终为零

我在SSMS中尝试了相同的简单查询,得到了相同的结果:0行受影响。 该表中有一个int列,名为NumVisits。 这是Global.asax.cs中应用程序_Start的一部分:

Application.Lock();
int iNumVisits = SomeClass.GetNumVisits();
SomeClass.UpdateNumVists(iNumVisits + 1);
Application.UnLock();
这是在某个类(BLL)中:

这是在达尔:

public void UpdateNumVists(int iNumVisits)
{
    int iRet = 0;
    try
    {
        dbContext.Open();
        List<SqlParameter> spParams = new List<SqlParameter>();
        string sQuery = "update Visits set NumVisits = @NumVisits";
        spParams.Add(dbContext.CreateSqlParam("@NumVisits", SqlDbType.Int, 0, iNumVisits));
        dbContext.ExecuteSqlNonQuery(sQuery, spParams, ref iRet);
    }
    catch (Exception e)
    {
        throw e;
    }
    finally
    {
        dbContext.Close();
    }
    return;
}

表中似乎没有数据,在
访问中是否有任何记录?

一般来说,更新不会发生有几个可能的原因

首先,如果该字段也是一个标识字段或计算字段,那么普通的更新将不起作用。这看起来不是你的情况,但很高兴知道未来的情况

接下来,如果表上有一个触发器,它可能会阻止更新。编写表脚本时,SSMS不一定要编写触发器的脚本,所以我无法判断是否有触发器

第三,也是最常见的一种情况,您的应用程序可能根本没有发送您期望的update语句,甚至在您期望的时候根本没有与数据库通信。当出现空值问题时,这通常是正确的。如果变量未正确填充,则可能确实正在将null值更新为null值。运行探查器以准确捕获尝试执行更新时发送的内容。通常,当您看到实际运行的语句时,您会看到问题所在。有时是缺少空间的问题,有时是未填充的变量,您认为已填充,等等

另一种可能是运行代码的用户没有表的更新权限。如果是这样的话,你应该得到一个信息

如果您已经运行了探查器,请尝试在SSMS中运行该代码,并查看它是否会更新。有时候,当你这样做的时候,你会发现一个更好的错误。特别是如果应用程序代码中的错误处理设计得不好


当然,如果表没有数据,则需要执行插入而不是更新。或者更新可能找不到任何要更新的记录,请尝试使用相同的条件进行选择,结果可能是没有要更新的记录。

表中是否有数据?最初,否。字段为空。所选方法返回零。但更新并不更新。我将把它初始化为零,看看它是否有区别。你能把你的评论改成回应吗?将空值更改为零修复了该问题。我会把它标记为答案,我同意。如果是这种情况,请给@AndrewDiamond信用,因为他在我把信用添加到我的答案之前先写了出来。
public void UpdateNumVists(int iNumVisits)
{
    int iRet = 0;
    try
    {
        dbContext.Open();
        List<SqlParameter> spParams = new List<SqlParameter>();
        string sQuery = "update Visits set NumVisits = @NumVisits";
        spParams.Add(dbContext.CreateSqlParam("@NumVisits", SqlDbType.Int, 0, iNumVisits));
        dbContext.ExecuteSqlNonQuery(sQuery, spParams, ref iRet);
    }
    catch (Exception e)
    {
        throw e;
    }
    finally
    {
        dbContext.Close();
    }
    return;
}
public void ExecuteSqlNonQuery(string sQuery, List<SqlParameter> spParams, ref int iRet)
{
    using (SqlCommand command = new SqlCommand())
    {
        command.CommandType = CommandType.Text;
        command.Parameters.AddRange(spParams.ToArray<SqlParameter>());
        command.Connection = DbConnection;
        command.CommandText = sQuery;
        try
        {
            iRet = command.ExecuteNonQuery();
        }
        catch(Exception e)
        { }
    }
}
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Visits](
    [NumVisits] [int] NULL
) ON [PRIMARY]

GO