如何防御性地编写代码以防止随机引用“表 0”和空值?

2023-12-09

我正在检索适量的数据并对其进行处理 - 没有什么独特的。起初奇怪的是,对于某些数据集,它工作得很好,而对于其他数据集,我收到以下错误消息:

enter image description here

不过,这个错误消息似乎完全是胡言乱语(无论如何都是误导性的),因为失败集的数据并不比成功集的数据多,所以运行“坏”数据不应该花费更长的时间比好的。

也许更具有启发性的是之后出现的其他错误消息:

enter image description here

enter image description here

注意:我得到这些详细的错误对话框,而不是更简洁的对话框,因为您可以在下面代码的 catch 块中看到调试代码。

因此,显然这并不是真正的“数据太多”问题,正如最初的错误消息所表明的那样。这也不是一个“缺失数据”问题,因为如果我查询 2014 年 12 月到 2015 年 12 月的数据(下个月没有数据),它运行得很好——它只返回 2015 年 12 月的全 0;所以这一定是一个“坏(不仅仅是丢失)数据”的问题。我如何确定什么是坏数据并防御性地防止它破坏应用程序的运行?

上面的 err 消息中涉及的第 601 行包含以下代码:

private void ReadData(string _unit, string monthBegin, string monthEnd, string beginYear, string endYear)
{
    try
    {
        String dateBegin = UsageRptConstsAndUtils.GetYYYYMMDD(monthBegin, beginYear, true);
        String dateEnd = UsageRptConstsAndUtils.GetYYYYMMDD(monthEnd, endYear, false);
        DateTime dtBegin = UsageRptConstsAndUtils.DatifyYYYYMMDD(dateBegin);
        DateTime dtEnd = UsageRptConstsAndUtils.DatifyYYYYMMDD(dateEnd);
        DataTable dtUsage = SqlDBHelper.ExecuteDataSet("sp_ViewProductUsage_MappingRS", CommandType.StoredProcedure,
            new SqlParameter() { ParameterName = "@Unit", SqlDbType = SqlDbType.VarChar, Value = _unit },
            new SqlParameter() { ParameterName = "@BegDate", SqlDbType = SqlDbType.DateTime, Value = dtBegin },
            new SqlParameter() { ParameterName = "@EndDate", SqlDbType = SqlDbType.DateTime, Value = dtEnd }
        );

SqlDBHelper.ExecuteDataSet() 是:

public static DataTable ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
    using (DataSet ds = new DataSet())
    using (SqlConnection connStr = new SqlConnection(UsageRptConstsAndUtils.CPSConnStr))
    using (SqlCommand cmd = new SqlCommand(sql, connStr))
    {
        cmd.CommandType = cmdType;
        foreach (var item in parameters)
        {
            cmd.Parameters.Add(item);
        }

        try
        {
            cmd.Connection.Open();
            new SqlDataAdapter(cmd).Fill(ds);
        }
        catch (SqlException sqlex)
        {
            for (int i = 0; i < sqlex.Errors.Count; i++)
            {
                var sqlexDetail = String.Format("From ExecuteDataSet(), SQL Exception #{0}{1}Source: {2}{1}Number: {3}{1}State: {4}{1}Class: {5}{1}Server: {6}{1}Message: {7}{1}Procedure: {8}{1}LineNumber: {9}",
                    i + 1, // Users would get the fantods if they saw #0
                    Environment.NewLine,
                    sqlex.Errors[i].Source,
                    sqlex.Errors[i].Number,
                    sqlex.Errors[i].State,
                    sqlex.Errors[i].Class,
                    sqlex.Errors[i].Server,
                    sqlex.Errors[i].Message,
                    sqlex.Errors[i].Procedure,
                    sqlex.Errors[i].LineNumber);
                MessageBox.Show(sqlexDetail);
            }
        }
        catch (Exception ex)
        {
            String exDetail = String.Format(UsageRptConstsAndUtils.ExceptionFormatString, ex.Message, Environment.NewLine, ex.Source, ex.StackTrace);
            MessageBox.Show(exDetail);
        }
        return ds.Tables[0];
    }
}

第 396 行(在最后一个错误消息中引用)是这里的第一行代码:

private String GetContractedItemsTotal()
{
    var allContractRecords = _itemsForMonthYearList.Where(x => x.ContractItem);
    var totalContractItemPurchases = allContractRecords.Sum(x => x.TotalPurchases);
    return totalContractItemPurchases.ToString("C");
}

什么可能导致此代码有时崩溃并出现“找不到表 0”和“值不能为空”异常?或者更重要的是,当值为空时,如何防止它造成如此严重的破坏?

更多背景信息:

_itemsForMonthYearList 定义如下:

private List<ItemsForMonthYear> _itemsForMonthYearList;

..并像这样填充:

var ifmy = new ItemsForMonthYear();

int qty = Convert.ToInt32(productUsageByMonthDataRow["TotalQty"]);
// TotalPrice as Decimal for calculation
Decimal totPrice = Convert.ToDecimal(productUsageByMonthDataRow["TotalPrice"]);
Decimal avgPrice = Convert.ToDecimal(productUsageByMonthDataRow["AvgPrice"]);
String monthYear = productUsageByMonthDataRow["MonthYr"].ToString();

ifmy.ItemDescription = desc;
ifmy.TotalPackages = qty;
ifmy.TotalPurchases = totPrice;
ifmy.AveragePrice = avgPrice;
ifmy.monthYr = monthYear;
ifmy.ContractItem = contractItem; // added 11/16/2016
if (null == _itemsForMonthYearList)
{
    _itemsForMonthYearList = new List<ItemsForMonthYear>();
}
_itemsForMonthYearList.Add(ifmy);

正如 jmcilhinney 所建议的,调整 CommandTimeout 值似乎已经解决了问题。

我最初将 SqlCommand 的 CommandTimeout 值设置为 300(5 分钟),但结果是“发生了上下文切换死锁”。所以我把它减少到 120(2 分钟),这对我来说似乎或多或少是“最佳点”。我确实在几次测试中得到了一次“超时过期”,但是当我重试相同的精确范围时,它第二次成功完成,所以我猜这只是“其中之一” - 120 有时不够超时,但 300 显然太多了。 IOW,这种太少和太多之间的平衡行为似乎并不是“一门精确的科学”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防御性地编写代码以防止随机引用“表 0”和空值? 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the

随机推荐

  • 如何卸载jupyter

    我一直在尝试卸载jupyter 我尝试过以下命令 pip uninstall jupyter pip3 uninstall jupyter and rm rf Users user Library Jupyter 即使在运行所有这些命令后
  • C : typedef 结构名称 {...}; VS typedef struct{...} 名称;

    正如标题所说 我有这样的代码 typedef struct Book int id char title 256 char summary 2048 int numberOfAuthors struct Author authors typ
  • 删除重复项,保留最后一个条目——优化

    我正在开发一个宏 它将遍历电子表格并根据两列 Q 列和 D 列 中分别提供的两个条件删除重复的条目 行 这是我所拥有的 我在一个小数据集上测试了它 它是slow Sub RemoveDupesKeepLast dim i As Intege
  • 在编译时设置属性而不知道目标类型

    我想在编译时不知道对象类型的情况下设置对象的属性值 我希望它很快 即不是每次都使用反射 我知道属性名称和类型 最快的方法 据我所知 是使用委托 这就是我到目前为止所拥有的 class User this is an example Assu
  • 并发和多线程有什么区别?

    并发和多线程有什么区别 并发只能在多核CPU上实现吗 有人能用例子解释一下吗 并发和多线程有什么区别 并发描述了进程运行的方式 它们要么是顺序的 一个接一个 要么是并发的 能够 同时 取得进展 尽管不一定在同一时刻 要么是并行的 它们同时发
  • git rebase——我的哈希值意外不匹配

    1 为什么我没有机会暂存我的提交片段 以便我可以在合并之前将它们分成不同的提交team 2 为什么rebase之前的hash不等于rebase之后的hash 我没有看到任何消息表明有一个被压扁的空白或其他东西 GIT work git lo
  • 多个电子邮件收件人的 XML 架构

    我需要一个示例 XSD 来支持新元素中的多个电子邮件收件人 我要求每个收件人的电子邮件地址位于不同的元素中 谁能帮我解释一下吗 Example
  • 如何检查这是目录路径还是任何文件名路径?

    by this 为什么 fopen any path name r 不给出 NULL 作为返回值 我知道在linux中目录和文件被认为是文件 所以当我在 fopen 中以读取模式给出任何目录路径或文件路径时 它不会给出 NULL 文件描述符
  • 如何合并具有相同标识符 R 的行?

    I have been searching a lot but I can t seem to find an answer for what I m looking for The rows were originally melted
  • 如何在ASP.NET中实现GZip压缩?

    我正在尝试为我的 asp net 页面 包括我的 CSS 和 JS 文件 实现 GZip 压缩 我尝试了以下代码 但它只压缩我的 aspx 页面 从YSlow HttpContext context HttpContext Current
  • 适用于具有两个类的元素的 CSS 选择器

    有没有一种方法可以根据设置为两个特定类的 class 属性的值来选择带有 CSS 的元素 例如 假设我有 3 个 div div class foo Hello Foo div div class foo bar Hello World d
  • NSSortDescriptor问题

    我正在制作一个通讯录应用程序 我从 AddressBook 中获取姓名并将其存储在核心数据中 并使用以下命令将姓名显示在表格上NSFetchedResultsController However出现的第一个索引和部分是 后跟字母 但我想像在
  • 如何从 web.config 引用程序集?

    我需要将对 System XML dll 程序集的引用添加到 web config 中 为了尝试解决问题 此处提到 扩展方法存在问题 IXmlLineInfo 我尝试将以下行添加到 程序集 部分
  • Vue路由器参数对象类型在浏览器后退按钮上更改

    我正在传递一个参数论坛 它是 Vue js 中路由的对象 使用 vue router path forum forum name ForumView component ForumView props true 当我通过使用页面上的另一个链
  • 鼠标悬停时反转文本颜色

    我想在使用自定义 黑色 光标悬停黑色文本时反转黑色文本 这个GIF演示了效果 我无法用 CSS 和 JS 来实现这个工作 我猜是与混合混合模式 剪贴蒙版 伪元素和过滤器的一些组合 以下代码使光标变为白色 但不允许黑色文本变成白色 听起来很抽
  • 尝试抓住展开的线吗?斯威夫特 2.0、XCode 7

    我的代码中有以下展开行 UIApplication sharedApplication openURL NSURL string url 有时会出现这样的致命错误 致命错误 在解包可选值时意外发现 nil 我知道为什么有时会出现此错误 但是
  • 将解析结果自动串联成向量

    我编写了一些规则来将浮点数解析为两个 std vector 的浮点数 它们又存储在一个结构中 数据输入 object name01 v 1 5701 33 8087 0 3592 v 24 0119 0 0050 21 7439 a com
  • 在 WHERE 子句中应用条件过滤

    我在 SELECT 语句中加入几个表 如下所示 它具有三个参数 DECLARE Jobid INT 0 leadid INT 0 employeeid INT 0 SELECT e id l id j id e NAME l NAME j
  • 如何在 jsp 页面和 servlet 之间共享数据

    我有几个 jsp 页面和几个 servlet 我需要将一些信息保存到会话变量中 在jsp页面中我简单的引用 session get or session set 无需显式声明 HttpSession 对象 但在 servlet 中 适用正确
  • 如何防御性地编写代码以防止随机引用“表 0”和空值?

    我正在检索适量的数据并对其进行处理 没有什么独特的 起初奇怪的是 对于某些数据集 它工作得很好 而对于其他数据集 我收到以下错误消息 不过 这个错误消息似乎完全是胡言乱语 无论如何都是误导性的 因为失败集的数据并不比成功集的数据多 所以运行