c# - 为什么我的 SqlCommand 返回一个字符串,而它应该是一个 int?

标签 c# sql-server linq-to-sql ado.net

我有一个查询应该总是返回一个整数。我现在已经记录了它返回一个与它应该是什么完全无关的字符串。

我们已经收到一些随机的 FormatExceptions,我们已经追踪到几个数据库查询。在一些额外的日志记录之后,我发现,今天早上,下面的查询返回了字符串“gladiator”。 Website.PkID 是一个 int 列,大部分时间都有效,但有时它会失败并返回一个 waaaay 的 int(比任何有效的 WebsiteID 都大)或一个随机字符串。

这个特定的查询在每次 session 开始时被命中一次。它没有使用共享连接,所以我无法理解它是如何得到如此困惑的结果的。连接池中是否存在某种损坏?

我不认为问题与此查询有关。我也看到了来自 LINQ 查询的类似 FormatExceptions(由于意外结果)。我们还大约在同一时间发现了其中一些错误:

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.

会不会是连接问题?或者,也许我们在数据库服务器和 Web 服务器之间混淆了结果集?这真让我摸不着头脑。

违规查询:

public static int GetActiveWebSiteID(string storeID, string statusID)
{
    int retval;

    string sql = @"SELECT isnull(MAX(PkID),0) FROM WebSite 
                   WHERE StoreID = @StoreID 
                   AND WebSiteStatusID = @WebSiteStatusID";

    SqlConnection conn = new SqlConnection(Settings.ConnString);
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@StoreID", (object)storeID ?? DBNull.Value);
    cmd.Parameters.AddWithValue("@WebSiteStatusID", (object)statusID ?? DBNull.Value);

    conn.Open();
    using(conn)
    {
        var scalar = cmd.ExecuteScalar(); // <-- This value returned here should only ever be an int, but randomly is a string

        retval = Convert.ToInt32(scalar);
    }
    return retval;
}

上述查询多年来一直运行良好,直到最近。我们现在在应用程序中有一堆额外的 LINQ 查询(不确定这是否会有所不同)。我们正在运行 .Net 3.5。

最佳答案

在忽略这个问题几个月后,随着流量逐渐增加,它开始达到临界质量。我们增加了日志记录并发现了许多明确的实例,在这些实例中,在重负载下,完全不同的结果集将返回到不相关的查询。

我们在 Profiler 中观察了查询,并且能够看到错误的结果总是与同一个 spid 相关联,并且每个错误的结果始终是被查询的实际 sql 语句后面的一个查询。这就像错过了一个结果集,并且返回了 spid 中的下一个结果集(来自同一池中的另一个连接)。疯了。

通过反复试验,我们最终找到了一些在使用后没有立即关闭 SqlConnection 的 SqlCommand 或 LINQ 查询。相反,通过一些源于对 LINQ 连接的误解的草率编程,DataContext 对象仅在请求结束时而不是立即被释放(并关闭连接)。

一旦我们重构这些方法以立即关闭与 C#“using” block 的连接(为下一个请求释放该池),我们就不会再收到错误。虽然我们仍然不知道连接池如此困惑的根本原因,但我们能够停止所有此类错误。此问题已与我发布的另一个类似错误一起解决,可在此处找到:What Causes "Internal Connection Fatal Errors"?

关于c# - 为什么我的 SqlCommand 返回一个字符串,而它应该是一个 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/882784/

相关文章:

sql - 将 Ms sql server 查询转换为 Ms Access?

c# - 如何使用存储过程在 LINQ to SQL 中使用事务?

c# - 如何知道哪个 Linq 语句在运行时产生了手头的 SQL?

c# - 在 Visual Studio 2010 中为 IE 中的 BHO 使用断点

sql - 合并 - 有条件 "WHEN MATCHED THEN UPDATE"

c# - DSA 使用相同的数据生成不同的签名

asp.net - 当多个用户从 asp 成员(member)身份登录时,如何将用户名放入 sql 触发器中

使用 LinqToSql 的 Winforms 应用程序架构

c# - 如何获取 TFS 2013 中所有用户的列表

c# - 自定义 AuthorizeAttribute Ninject 属性注入(inject)不起作用(注入(inject)的属性具有需要注入(inject)的子依赖服务)