【问题标题】:When calling stored procedure, .hasRows keeps staying "false"调用存储过程时,.hasRows 保持“假”
【发布时间】:2012-09-25 16:56:57
【问题描述】:

我有一个正在调用的存储过程,它将从表中返回数据。

但是当我尝试用数据填充 .aspx 时,它会跳过我的方法,因为我的方法是基于读取器是否检测到行。

这是我的方法:

private void editExhibit(int expenseID)//new
{
  saveExhibitBtn.Text = "Update Exhibit";

  SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ToString());
  SqlCommand cmd = new SqlCommand("p_CaseFiles_Exhibits_RetrieveExhibitDetails", conn);
  cmd.CommandType = CommandType.StoredProcedure;
  //cmd.Parameters.AddWithValue("@ExhibitID", expenseID);
  cmd.Parameters.Add(new SqlParameter("@ExhibitID", SqlDbType.Int));
  cmd.Parameters["@ExhibitID"].Value = expenseID;

  bool hasAttachments = false;
  string investigatorID = "";
  //bool alreadyInvoiced = false;
  bool isExpenseOwner = false;
  string fileID = "-1";

  try
  {
      conn.Open();
      var reader = cmd.ExecuteReader();
      if (reader.HasRows)//////////////////////craps out here bcause hasRows is false....
      {
          reader.Read();
          fileID = reader["FileID"].ToString();
          ddlCaseFiles.SelectedValue = fileID;
          ddlCaseFiles.Enabled = false;
          // retrieve exhibit details here
          hasAttachments = (bool)reader["HasAttachments"];
          investigatorID = reader["InvestigatorID"].ToString();
          if (Session["InvestigatorID"].ToString() == investigatorID)
          {
              isExpenseOwner = true;
          }
          txtDateReceived.Value = reader["SeizeDate"].ToString();
          ddlReceivedBy.SelectedValue = reader["SeizedByInvestigatorID"].ToString();
          txtTimeReceived.Value = reader["SeizeTime"].ToString();
          txtWhyHowReceived.Value = reader["SeizeAuthority"].ToString();
          txtReceivedLocation.Value = reader["SeizeLocation"].ToString();
          txtOurItemNum.Value = reader["NewExhibitOutItemNumber"].ToString();////////////
          txtTheirItemNum.Value = reader["ClientItemNum"].ToString();
          txtBagNum.Value = reader["BagNumber"].ToString();
          txtBoxNum.Value = reader["BoxNumber"].ToString();
          txtComment.Value = reader["ExhibitDecriptionPlainText"].ToString();
      }
  }
  catch (SqlException ex)
  {
      ErrorLogger.Log(ex.Number, "NewExhibit.aspx - editExhibit - Retrieve Details", ex.Message);
  }

这是我的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[p_CaseFiles_Exhibits_RetrieveExhibitDetails]
  @FilterField nvarchar(max)=null
, @FilterQuery nvarchar(max)=null
, @SortName nvarchar(max)='SeizeDate, SeizeTime '
, @SortOrder nvarchar(max)='desc'
, @ExhibitID int
as
SET CONCAT_NULL_YIELDS_NULL OFF
declare @Command nvarchar(max)
Select @Command = 'select E.ExhibitID,convert(nvarchar,SeizeDate,111) as ''SeizeDate'',SeizeTime,ExhDesc,E.InvestigatorID as ''EnteredBy'' 
  ,E.SeizedByInvestigatoID as ''SeizedBy'',SBI.ActiveInvestigator, SBI.FName+'' '' + SBI.LName as ''SeizedByName'', E.FileID,[FileName]
  ,Investigators.FName,Investigators.LName,SzAuthority,Location,ItemID,SubItemID1,SubItemID2,SubItemID3,PageSerial,ClientItemNum,Privileged
  ,Private,E.HasAttachments,ItemEntryGradeID,BagNumber,BoxNumber,PL.PropertyId,P.PropertyTypeID,P.PropertyMakeID,P.PropertyModelID,SerialNumber,ColorID
  ,cast(ItemID as varchar)+''-''+cast(SubItemID1 as varchar)+''-''+cast(SubItemID2 as varchar)+''-''+cast(SubItemID3 as varchar) as ''ItemNumber'',StoredLocally 
  from CaseFileExhibits E 
  join Investigators on E.InvestigatorID = Investigators.InvestigatorID 
  join Investigators SBI on SBI.InvestigatorID=E.SeizedByInvestigatoID 
  join CaseFiles on E.FileID = CaseFiles.FileID 
  left join CaseFileExhibitPropertyLink PL on E.ExhibitID=PL.ExhibitID 
  left join Element09a_Properties P on P.PropertyID=PL.PropertyId 
  left join ElementPropertyTypes PT on PT.PropertyTypeID=P.PropertyTypeID 
  left join ElementPropertyMakes PM on PM.PropertyMakeID=P.PropertyMakeID 
  left join ElementPropertyModels PMD on PMD.PropertyModelID=P.PropertyModelID 
  where E.ExhibitID='+convert(nvarchar,@ExhibitID);
if(@FilterQuery is not null)
begin
  select @Command+=' and '+@FilterField+ ' like '''+@FilterQuery+''' ';
end
select @Command+=' order by '+@SortName+' '+@SortOrder

所以根据存储过程我只需要传入exhibitID就行了。

【问题讨论】:

  • 愚蠢的问题,但是使用 SQL 管理工作室运行 StoredProcedure 有结果吗?
  • 呵呵,非常感谢。是的,确实如此
  • 请说明您是如何在 sql management studio 中调用存储过程的。您可能必须使用命名参数来调用它,例如:exec p_CaseFiles_Exhibits_RetrieveExhibitDetails @ExhibitID = 'SOMETHING'。另外,请参阅下面的答案
  • 您可能还需要考虑优化此存储过程。您可以尝试将结果加载到表变量中,这将允许 sql-server 编译您的查询,这将使其在后续调用中运行得更快,然后使用动态 sql 来实现排序。

标签: asp.net sql sql-server tsql stored-procedures


【解决方案1】:

您的存储过程看起来不完整。您可能需要添加

exec sp_executesql @command;

最后让它返回你的行。

关于 sp_executesql 的信息可以在http://msdn.microsoft.com/en-us/library/ms188001.aspx找到

【讨论】:

  • 工作。你能解释一下 SP_ExecuteSQL 吗?我必须等待 6 分钟才能将您的答案标记为答案
  • 简而言之,您将 sql 放在一个字符串中,在您的情况下,所有 SP_executesql 所做的就是执行保存在该字符串中的 sql。我在我的答案中添加了 MSDN 参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 2015-11-02
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多