我有一个列表来跟踪访问次数。在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
答案 0 :(得分:1)
表格中似乎没有数据,Visits
中是否有任何记录?
答案 1 :(得分:1)
一般情况下,更新不会发生的原因有几个。
首先,如果该字段也是标识或计算字段,则普通更新不起作用。这看起来并非如此,但了解未来是件好事。
接下来,如果表上有触发器,则可能阻止更新。当您编写表格脚本时,SSMS不必编写触发器脚本,因此我无法判断您是否有触发器。
第三,最常见的情况是,您的应用程序可能无法发送您期望的更新语句,甚至可能无法按预期与数据库进行通信。当存在空值问题时,这通常是正确的。如果您的变量没有正确填充,那么您可能确实将空值更新为空值。运行Profiler以准确捕获尝试执行更新时发送的内容。通常当您看到实际运行的语句时,您将看到问题。有时这是一个缺少空间的问题,有时是一个你认为已经填充的变量,等等。
另一种可能性是运行代码的用户没有对表的更新权限。如果是这种情况,你应该收到一条消息。
如果您运行过Profiler,请尝试在SSMS中运行该确切代码,看看它是否更新。有时,当你这样做时,你会得到更好的错误。特别是如果应用程序代码中的错误处理设计得不好。
当然,如果表没有数据,则需要插入而不是更新。或者更新可能没有找到任何要更新的记录,尝试使用相同的条件进行选择,并且可能会发现没有要更新的记录。