MS SQL无法更新表

时间:2017-06-28 18:17:15

标签: c# asp.net sql-server-2008

我有一个列表来跟踪访问次数。在Global.asax.cs中,我尝试在application_start中将此值递增1,但该字段不会更新。我没有例外,但受影响的行数始终为零。

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

Application.Lock();
int iNumVisits = SomeClass.GetNumVisits();
SomeClass.UpdateNumVists(iNumVisits + 1);
Application.UnLock();

这是在SomeClass(BLL)中:

public static void UpdateNumVists(int iNumVisists)
{
    LocaleRepository oLocaleRepository = new LocaleRepository(new SqlDbContext());
    oLocaleRepository.UpdateNumVists(iNumVisists);
}

这是在DAL中:

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;
}

我对使用executeNonQuery的所有命令使用以下命令:

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)
        { }
    }
}

执行更新命令时,iRet为零。我不明白为什么简单的更新查询不起作用。

这是我从SSMS获得的创建脚本:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

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

GO

2 个答案:

答案 0 :(得分:1)

表格中似乎没有数据,Visits中是否有任何记录?

答案 1 :(得分:1)

一般情况下,更新不会发生的原因有几个。

首先,如果该字段也是标识或计算字段,则普通更新不起作用。这看起来并非如此,但了解未来是件好事。

接下来,如果表上有触发器,则可能阻止更新。当您编写表格脚本时,SSMS不必编写触发器脚本,因此我无法判断您是否有触发器。

第三,最常见的情况是,您的应用程序可能无法发送您期望的更新语句,甚至可能无法按预期与数据库进行通信。当存在空值问题时,这通常是正确的。如果您的变量没有正确填充,那么您可能确实将空值更新为空值。运行Profiler以准确捕获尝试执行更新时发送的内容。通常当您看到实际运行的语句时,您将看到问题。有时这是一个缺少空间的问题,有时是一个你认为已经填充的变量,等等。

另一种可能性是运行代码的用户没有对表的更新权限。如果是这种情况,你应该收到一条消息。

如果您运行过Profiler,请尝试在SSMS中运行该确切代码,看看它是否更新。有时,当你这样做时,你会得到更好的错误。特别是如果应用程序代码中的错误处理设计得不好。

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