当前位置: 首页 > 知识库问答 >
问题:

SQL查询字符串在SQL Server Management Studio中工作,但在VB.NET中不能使用SqlCommand.ExecuteReader

寿子轩
2023-03-14

我有一个使用VB.NET代码的ASPX页,它被设置为运行一系列SQL查询并用结果填充SQLDataReader。每个SQL查询都是从SQL数据库中表中的特定字段提取的。除了一个查询之外,这段代码对我运行的每一个查询都非常有效。

所涉及的VB代码如下。

Dim SQL_Template_Query As String
Dim cmd3 As SqlCommand = New SqlCommand
Dim r3 As SqlDataReader    

cmd3 = New SqlCommand(SQL_Template_Query)
cmd3.CommandTimeout = 1200 ' Extended to 1200 sec = 20 min
cmd3.CommandType = CommandType.Text
cmd3.Connection = Global_Objects.SQLLocalDB_Connection
Try
    r3 = Nothing
    r3 = cmd3.ExecuteReader() ' THIS LINE IS WHERE THE ERROR OCCURS
Catch
    Session("Main_Error_Code") = 1
    Session("Main_Error_Message") = "The SQL statement for the following address is invalid. Please examine the GCDB_Excel_Reports_Templates record, and correct." &
                    Chr(13) & "ID " & ti.ID & ", " & ti.Sheet_Name & ", " & ti.Cell_Address

    ' Write to error log
    cxlErrorsSheetLog.Cell("A" & cxlErrorsCurRow).Value = Session("Main_Error_Message")
    cxlErrors.SaveAs(cxlErrorsPath)
    cxlErrors = Nothing
    cxlDoc = Nothing
    Return
End Try

正如您所看到的,我已经准备好了捕获错误的代码,所以我知道错误发生的确切位置,但我不确定为什么。错误发生在

DECLARE @Start_Year int;
SET @Start_Year=2018;
DECLARE @Reporting_Year int;
SET @Reporting_Year=2021;

declare @First_Year int;
set @First_Year =  
(  
case   
when (@Reporting_Year-@Start_Year+1)<=5 then @Start_Year   
else @Reporting_Year - 4 end  
);       

drop table if exists #Reporting_Years;       

create table #Reporting_Years  
(
Reporting_Year int
);   

insert into #Reporting_Years 
select distinct YEAR(Single_Date) 
from Single_Dates where YEAR(Single_Date) 
between @Reporting_Year-4 and @Reporting_Year;   

drop table if exists #Has_ACT;   

create table #Has_ACT (Building_ID int,Start_Date datetime,End_Date datetime);   

insert into #Has_ACT  
select distinct Building_ID,MIN(Start_Date),MAX(End_Date)  from Tracking_Periods  
where Utility_Type_ID between 16 and 19 
and YEAR(Start_Date)<=@Reporting_Year  
and (YEAR(End_Date)>=@First_Year or End_Date is null)  
group by Building_ID;     

select i1.Reporting_Year,  
SUM(case when i2.Asset_Class like 'Office' then GFA else null end) as Office_GFA,  
SUM(case when i2.Asset_Class like 'Retail' then GFA else null end) as Retail_GFA,  
SUM(case when i2.Asset_Class like 'Industrial' then GFA else null end) as Industrial_GFA  
from #Reporting_Years i1  
left join
(
select z1.Reporting_Year,x.Building_ID,y.Building,y.Asset_Class,x.Start_Year,x.End_Year,y.Most_Recent_GFA_Year,  
case  when z1.Reporting_Year<=y.Most_Recent_GFA_Year   
then 
(select GFA from Annual_GFA where Building_ID=x.Building_ID and Reporting_Year=z1.Reporting_Year)  
else 
(select GFA from Annual_GFA where Building_ID=x.Building_ID and Reporting_Year=y.Most_Recent_GFA_Year)
end as GFA  
from   
(  
select Building_ID,  
case  
when YEAR(Start_Date)<@First_Year then @First_Year  
else YEAR(Start_Date) end as Start_Year,  
case  
when End_Date is null then @Reporting_Year  
when YEAR(End_Date)>@Reporting_Year then @Reporting_Year  
else YEAR(End_Date) end as End_Year from #Has_ACT) x  
left join   
(
select a.Building_ID,a.Building,a.Asset_Class,MAX(a.Reporting_Year) as Most_Recent_GFA_Year  
from View_All_Buildings_Annual_GFA a      
inner join View_All_Buildings b on a.Building_ID=b.Building_ID      
inner join View_All_Building_Ownership_By_Year c on c.Building_ID=a.Building_ID and c.Reporting_Year=@Reporting_Year      
inner join Building_Ownership d on a.Building_ID=d.Building_ID      
left join Override_Building_Count e on a.Building_ID=e.Building_ID and e.Report_ID=5      
inner join #Has_ACT f on f.Building_ID=a.Building_ID    
where b.Asset_Manager like 'Anonymous'      
and b.Not_On_Program=0 and b.Exclude_From_Reporting=0 and b.Tenant=0      
and d.Year_Removed is null    
and (e.Building_Count<>0 or e.Building_Count is null)  
group by a.Building_ID,a.Building,a.Asset_Class) y on x.Building_ID=y.Building_ID  
cross join #Reporting_Years z1 where z1.Reporting_Year between @First_Year and @Reporting_Year  
and z1.Reporting_Year>=x.Start_Year and z1.Reporting_Year<=x.End_Year  
and y.Building_ID is not null) i2 on i1.Reporting_Year=i2.Reporting_Year  
where i1.Reporting_Year between @Start_Year and @Reporting_Year  
group by i1.Reporting_Year  
order by i1.Reporting_Year;  

如有任何建议,不胜感激。我还想知道是否有方法让SQLDataAdapter或SQLCommand返回错误。这会让事情更容易诊断。

更新:如果注释掉Try...catch...End Try,并允许Visual Studio生成错误,则会收到以下命令。

共有1个答案

萧永长
2023-03-14

因此,对于使用单个连接的多个SQL查询,@AndrewMorton似乎是正确的。我创建了一个全新的VB.NET项目,添加代码来提取导致问题的特定存储SQL语句,然后运行它。它没有问题。知道了这一点,在最初的项目中,我替换代码在单独的连接上运行特定的SqlCommand,在每个循环之后处理连接实例。

代码现在按预期工作。目前还不清楚为什么这个特定的SQL语句会导致这个问题,但其他语句不会。然而,不管怎样,我将重新处理这个项目中的所有代码,以移除单个连接对象。

@AndrewMorton的另一个评论https://ubitsoft.com/t-sql-Beautilyzer/中提供的链接也很有帮助。实际上,我一直在寻找一种独立检查SQL查询的方法,而不需要底层数据库

 类似资料:
  • 我变得非常困惑,我试图通过laravels query builder运行一个应该可以工作的查询,但它会抛出奇怪的错误。

  • 问题内容: 嗨,我在使用sql查询时遇到问题,它在控制台中可以完美地工作,但是当我在python中实现时,它似乎可以完美地工作,但是没有错误,但是当我检查数据库时,它没有起作用,但是在控制台中,它确实可以工作,但是没有错误。我检查数据库中的数据是否存在…我使用的查询完全相同。 有任何想法吗? 在python中: 查询在打印中显示良好,没有问题,如果我将打印内容复制并粘贴到mysql控制台中,则每次

  • 我在Hibernate4.0.1中遇到了本地查询问题。我有查询工作在数据库控制台,但不是在应用程序。我有: 名为“case”的表有两列指向同一个表--名为“cost”的表,其列为“value”。我的查询如下所示: 有人提到,'value'不是列的专有名称。这是真的,事实上这个列不是名为'value',而是有点不同。我的严格合同禁止发布任何关于代码的信息。我必须尽可能地释义它,所以我在fly中重命名

  • 以下连接字符串在我的站点中工作正常: 但是,当我试图设置DSN(使用64位odbc管理)时,我会遇到以下错误: 请记住,我使用的帐户和密码与连接字符串中使用的相同(这是有效的)。这也很奇怪,因为错误发生在我单击“SQL Server应该如何验证登录ID的真实性?”中的“下一步”之后。佩奇。 null

  • 问题内容: 我尝试在提交之前对该字符串进行。 问题答案: 你需要将参数传递为映射或2元组序列,例如: Python 3或以上 采用: 请注意,这在通常意义上不会进行url编码(请看输出)。为此使用。