- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个查询应该总是返回一个整数。我现在已经记录了它返回一个与它应该是什么完全无关的字符串。
我们已经收到一些随机的 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/
我需要使用 ADO.NET 将一系列命令发送到 SQL 2008,以便逐个执行。我应该为我发送的每个 SQL 创建一个新的 SQLCommand 吗?或者重用相同的 SQLCommand 并仅更改 C
我们可以在将参数传递给 sql 查询时同时使用这两种方法吗? 那么它们之间有什么区别呢? 最佳答案 MSDN article on AddWithValue() 解释两者之间的差异。内是对细微差异的解
我已经彻底搜索,但找不到 SET 的方法我的列数据到我使用 SQL 初始化的变量 UPDATE陈述。 这是导致问题的一段代码: int maxId; SqlConnection dataConnect
使用 SqlParameters是防止数据库查询中的 SQL 注入(inject)的推荐方法。我在哪里可以找到内部清理这些参数的代码/函数?我想在我的自定义实现中重新使用这个函数。我尝试使用 Refl
我目前正在使用 SQL Server 2014 中的 C# 脚本更新和读取值。当使用 SQlCommand 执行非查询时,运行脚本时会弹出错误: IndexOutOfRangeException: A
我最近一直在做一个旧项目。我在项目中发现以前的同事已经创建了一些用于打开与数据库的连接的常用方法。但是我怀疑这个过程是否真的在查询完成后通过 IDispose 处理连接。 方法如下: 连接数据库。 /
抱歉格式化,有点粗糙 我在 C# 中通过 SQLCommand 插入语句时遇到问题。插入完成后,ID 将返回给程序。 我填充了一些变量并编写了一个 SQLCommand。考虑了所有参数。 using
我有以下 SQL 语句(如果我在我的数据库中像这样执行它,它会起作用): IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = '
我有一个 C# 程序,我在其中创建了各种类,所有类都需要调用数据库。所以我决定创建一个静态类来处理所有调用,以便我可以非常轻松地应用影响深远的更改。在那个类中,我有调用 SqlCommand 各个部分
试图只返回前几行,因为我的数据库太大了,但是当我测试我的 SQL 时,我做了一个 select * 并且只返回了第一行。 SqlCommand sqlCmd = new SqlCommand(); S
我对从 SqlCommand 返回的值有疑问,我有这段代码: string sqlSelect = "Select TOP 1 Quotation.SentToSupp as SentToSupp F
我正在 .Net 中创建测试方法,需要更改数据库以设置测试场景。我们使用 SqlCommands 发送查询来更改数据库,为此连接字符串是受信任的连接字符串。所有 DROPS 和 ALTER 查询对于表
我试图通过 SqlCommand 将表名作为参数传递给我的查询,但它似乎不起作用。这是我的代码; SqlConnection con = new SqlConnection( "server=.;us
当我在 SSMS 中执行以下命令时,我得到了预期的结果 - SELECT * FROM [Event] WHERE Active = 'True' AND [Name] LIKE '%P%' 即显示名
我在 C# 中运行一条返回一个值(字符串)的 SQL 命令。然后我试图将它保存到一个变量,但它总是抛出这个异常: A first chance exception of type 'System.In
我有这个 SqlCommand,但我不知道如何给出返回值? string param = Request.QueryString["id"]; System.Data.SqlClient.SqlCon
我对使用 C# 和 ASP.NET 还很陌生,我很好奇在 SQL 数据库上运行多个查询时是否有命名 SqlCommand 的约定。例如,我已经创建了我的 SqlConnection,我希望调用一个函数
好吧,这是微不足道的,但它一直困扰着我。我有这样的代码 oCmd = new SqlCommand("getBooking", oCon); oCmd.CommandType = CommandTyp
如果我有这个变量: int value = 4; 将作为一些 sql 参数传递: SqlCommand sqlcmd = new SqlCommand(); sqlcmd.Parameters.Add
我使用以下代码从 SQL Server 表中进行选择: using (SqlConnection con = new SqlConnection(SqlConnectionString)) {
我是一名优秀的程序员,十分优秀!