Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 慢速安全数据读取器循环_Vb.net_Executereader - Fatal编程技术网

Vb.net 慢速安全数据读取器循环

Vb.net 慢速安全数据读取器循环,vb.net,executereader,Vb.net,Executereader,我有一个vb.net/SQL Server客户端应用程序,需要在其中向现有查询添加左连接。asp.net使用数据层中的相同代码检索应用程序web版本的数据。接下来的两个代码块显示整个原始语句和包含所有联接的新语句。我建议您跳到较低的代码块,这些代码块要小得多,以说明问题。 原始查询: select q.qasr_id as Id, q.qasr_identification_number as IdentificationNumber, q.s

我有一个vb.net/SQL Server客户端应用程序,需要在其中向现有查询添加左连接。asp.net使用数据层中的相同代码检索应用程序web版本的数据。接下来的两个代码块显示整个原始语句和包含所有联接的新语句。我建议您跳到较低的代码块,这些代码块要小得多,以说明问题。 原始查询:

    select q.qasr_id as Id,
           q.qasr_identification_number as IdentificationNumber,
           q.status as Status,
           b.business_unit_name as BusinessUnitName,
           b.business_unit_id as BusinessUnitId,
           u.login as Originator,
           q.date_created as DateCreated,
           q.po_number as PoNumber,
           q.po_part_number as PoPartNumber,
           q.po_part_rev as PoPartRev,
           q.lot_quantity as LotQuantity,
           q.control_number as ControlNumber,
           q.item_number as PoItem,
           q.buyer as Buyer,
           q.buyercode as BuyerCode,
           q.spe as Spe,
           p.program as ProgramName,
           l.product_line as productline,
           s.ent_supplier_nbr as SupplierEsd,
           s.sup_name1 as SupplierName,
           c.commodity_code as CommodityCode,
           a.agency_name as AgencyName,
           q.verifyid as AgencyDocId,
           q.activity as Activity,
           case q.isdeleted when 1 then 'Deleted' else '' end as Deleted
      from qasr q
      join auth_user u on q.auth_user_id = u.auth_user_id
      join functional_area f on q.functional_area_id = f.functional_area_id
      join business_unit b on f.business_unit_id = b.business_unit_id
      left join suppliers s on q.supplier_id = s.supplier_id
      left join programs p on q.program_id = p.program_id
      left join product_lines l on p.product_line_id = l.product_line_id
      left join commodities c on q.commodity_id = c.commodity_id
      left join agency a on q.agency_id = a.agency_id
       where b.business_unit_id = @BusinessUnitId
         and q.isdeleted = @IsDeleted
新查询:

    select q.qasr_id as Id,
           q.qasr_identification_number as IdentificationNumber,
           q.status as Status,
           b.business_unit_name as BusinessUnitName,
           b.business_unit_id as BusinessUnitId,
           u.login as Originator,
           q.date_created as DateCreated,
           q.po_number as PoNumber,
           q.po_part_number as PoPartNumber,
           q.po_part_rev as PoPartRev,
           q.lot_quantity as LotQuantity,
           q.control_number as ControlNumber,
           q.item_number as PoItem,
           q.buyer as Buyer,
           q.buyercode as BuyerCode,
           q.spe as Spe,
           p.program as ProgramName,
           l.product_line as productline,
           s.ent_supplier_nbr as SupplierEsd,
           s.sup_name1 as SupplierName,
           c.commodity_code as CommodityCode,
           a.agency_name as AgencyName,
           q.verifyid as AgencyDocId,
           q.activity as Activity,
           case q.isdeleted when 1 then 'Deleted' else '' end as Deleted,
           case when m.d_count > 0 then 'Yes' else 'No' end as Dispositioned
      from qasr q
      join auth_user u on q.auth_user_id = u.auth_user_id
      join functional_area f on q.functional_area_id = f.functional_area_id
      join business_unit b on f.business_unit_id = b.business_unit_id
      left join suppliers s on q.supplier_id = s.supplier_id
      left join programs p on q.program_id = p.program_id
      left join product_lines l on p.product_line_id = l.product_line_id
      left join commodities c on q.commodity_id = c.commodity_id
      left join agency a on q.agency_id = a.agency_id
      left join (select qasr_id as qasr_id, count(1) as d_count
                   from qasr_metric
                  where d = 1
                  group by qasr_id) m on m.qasr_id = q.qasr_id
       where b.business_unit_id = @BusinessUnitId
         and q.isdeleted = @IsDeleted
新查询向第二个表(qasr_metric)添加一个左联接,以确定第二个表是否包含列“D”中值为1的任何关联行。qasr_度量表由(quasr_id,d)索引,这就是性能受影响最小的原因。删除所有其他列和联接归结为以下两个方面的差异:

    select q.qasr_id as Id from qasr q

应用程序asp.net端的新查询的性能与原始查询的性能相差约3秒,如果我在SQL Server Mgmt Studio中单独运行查询,情况也是如此。然而,应用程序的客户端在几秒钟内处理原始查询的结果,而新查询则需要一个多小时,这是荒谬的。查看vb代码本身,数据层使用参数化查询调用ExecuteReader,这几乎立即完成原始查询和新查询。问题发生在业务层中,该层由ExecuteReader作为读取器调用。每行返回的数据用于填充新对象(InspectionDocumentSummary),这些对象的列表用于填充显示给用户的DataGridView。为了简洁起见,将几个创建新对象的子对象组合在一起可以得到:

    Private Sub Fetch(ByVal dr As SafeDataReader)
       Using dr
          While dr.Read()
             Add(InspectionDocumentSummary.GetInspectionDocumentSummary(dr))
             _id = dr.GetGuid("Id")
             _identificationNumber = dr.GetString("IdentificationNumber")
             _status = dr.GetString("Status")
             _originator = dr.GetString("Originator")
             _dateCreated = dr.GetSmartDate("DateCreated")
             _poPartNumber = dr.GetString("PoPartNumber")
             _poPartRev = dr.GetString("PoPartRev")
             _lotQuantity = Convert.ToString(dr.GetInt32("LotQuantity"))
             _buyer = dr.GetString("Buyer")
             _spe = dr.GetString("Spe")
             _agencyDocId = dr.GetString("AgencyDocId")
             _agencyName = dr.GetString("AgencyName")
             _activity = dr.GetString("Activity")
             _controlNumber = dr.GetString("ControlNumber")
             _dispositioned = dr.GetString("Dispositioned")
             _programName = dr.GetString("ProgramName")
             _supplierEsd = dr.GetString("SupplierEsd")
             _supplierName = dr.GetString("SupplierName")
             _commodityCode = dr.GetString("CommodityCode")
          End While
       End Using
    End Sub

对于原始查询,这几乎立即完成,但新查询需要一个多小时。据我所知,ExecuteReader检索数据,dr.Read循环只是将返回的数据读取到正在填充的DataGridView中(在我的例子中没有其他数据处理)。我将上述代码中的“_dispositioned=dr.GetString(“dispositioned”)”替换为“_dispositioned=“Yes”,没有任何更改,因此数据读取本身不是问题。有什么建议吗?

对于在查询中转换为字符串的类型,许多类似的问题都是这样做的,例如在比较或连接varchar和int时

如果直接从数据库运行查询时没有性能问题,请尝试运行查询,并在数据读取器读取行后让.NET执行数据类型转换,如下所示:

Private Sub Fetch(ByVal dr As SafeDataReader)
   Using dr
      While dr.Read()
         Add(InspectionDocumentSummary.GetInspectionDocumentSummary(dr))
         _id = GUID.Parse(dr("Id"))
         _identificationNumber = dr("IdentificationNumber")
         _status = dr("Status")
         _originator = dr("Originator")
         _dateCreated = dr.GetSmartDate("DateCreated")
         _poPartNumber = dr("PoPartNumber")
         _poPartRev = dr("PoPartRev")
         _lotQuantity = Convert.ToString(dr.GetInt32("LotQuantity"))
         _buyer = dr("Buyer")
         _spe = dr("Spe")
         _agencyDocId = dr("AgencyDocId")
         _agencyName = dr("AgencyName")
         _activity = dr("Activity")
         _controlNumber = dr("ControlNumber")
         _dispositioned = dr("Dispositioned")
         _programName = dr("ProgramName")
         _supplierEsd = dr("SupplierEsd")
         _supplierName = dr("SupplierName")
         _commodityCode = dr("CommodityCode")
      End While
   End Using
End Sub

如果这样做没有帮助,请尝试运行它,而不调用
Add
,以确保该方法中的某些内容不会导致问题。

在查询中将类型转换为字符串时,会遇到许多类似的问题,例如在比较或连接varchar和int时

如果直接从数据库运行查询时没有性能问题,请尝试运行查询,并在数据读取器读取行后让.NET执行数据类型转换,如下所示:

Private Sub Fetch(ByVal dr As SafeDataReader)
   Using dr
      While dr.Read()
         Add(InspectionDocumentSummary.GetInspectionDocumentSummary(dr))
         _id = GUID.Parse(dr("Id"))
         _identificationNumber = dr("IdentificationNumber")
         _status = dr("Status")
         _originator = dr("Originator")
         _dateCreated = dr.GetSmartDate("DateCreated")
         _poPartNumber = dr("PoPartNumber")
         _poPartRev = dr("PoPartRev")
         _lotQuantity = Convert.ToString(dr.GetInt32("LotQuantity"))
         _buyer = dr("Buyer")
         _spe = dr("Spe")
         _agencyDocId = dr("AgencyDocId")
         _agencyName = dr("AgencyName")
         _activity = dr("Activity")
         _controlNumber = dr("ControlNumber")
         _dispositioned = dr("Dispositioned")
         _programName = dr("ProgramName")
         _supplierEsd = dr("SupplierEsd")
         _supplierName = dr("SupplierName")
         _commodityCode = dr("CommodityCode")
      End While
   End Using
End Sub

如果这没有帮助,请尝试在不调用
Add
的情况下运行它,以确保该方法中的某些内容不会导致问题。

因此有两件事。1、如果您没有呼叫
Add
,是否存在问题。2) 尝试使用dr(ColumnName)而不是dr.GetString(ColumnName)进行查询,因为查询时间过长可能是由于将查询中的类型转换为varchar。1、如果您没有呼叫
Add
,是否存在问题。2) 尝试使用dr(ColumnName)而不是dr.GetString(ColumnName)进行查询,因为查询时间过长可能是由于将查询中的类型转换为varchar所致。