运行一个存储过程时返回异常

时间:2012-10-26 08:16:08

标签: c# sql-server

我有这个存储过程

create PROCEDURE spgetoutpatientidbyinpatientid
@pinpatientid int
AS

BEGIN

select  Patient_ID 
    from tblPatientAdmissionDetails 
    where ID=@pinpatientid and Status=1
END
GO

如果这个条件错了,我得到了null异常。我想至少返回null值或者什么。我可以避免这个错误。在我的代码中,我使用

<pre lang="c#">string  ds = UserDataBase.ExecuteScalar(Command).ToString();</pre>

如何更改我的SQL查询..?或者我该如何避免这种异常

5 个答案:

答案 0 :(得分:2)

更新您的程序可能对您有帮助,return -1如果您没有条件记录..

create PROCEDURE spgetoutpatientidbyinpatientid
@pinpatientid int
AS

BEGIN

  if exists( select  Patient_ID from tblPatientAdmissionDetails 
       where ID=@pinpatientid and Status=1) 
  begin
      select  Patient_ID from tblPatientAdmissionDetails 
       where ID=@pinpatientid and Status=1)
  end
  else 
  begin
      select -1 
  end
END
GO

答案 1 :(得分:1)

一种方法:

declare @bogus_int int, @result int
set @bogus_int = -1000

select @result = Patient_ID 
from tblPatientAdmissionDetails 
where ID=@pinpatientid and Status=1

select coalesce( @result, @bogus_int )

答案 2 :(得分:0)

来自C#

string ds = "";
object val = UserDataBase.ExecuteScalar(Command);
if(val != null)
   ds = val.ToString();

答案 3 :(得分:0)

在SP级别返回没有行并不是真正的错误;我建议反对在这里更改SP。实际上,它归结为你如何调用它,并检查无行与空对比数据。

可以通过命令执行此操作,但它有点乱。我的偏好是简化;例如,使用现有存储过程调用dapper

int id = 123;
var activePatient = connection.Query<int>(
    "spgetoutpatientidbyinpatientid", // command
    new { pinpatientid = id }, // parameters
    commandType: CommandType.StoredProcedure).Single();

其中connection是任何常规ADO.NET连接(SqlConnection等)。如果存在零个或多个匹配项,则使用LINQ的Single()将自动抛出异常。否则,activePatient将包含返回的列。请注意,您可以将<int>替换为<Patient>,以使其填充整个对象模型。

答案 4 :(得分:-1)

string  ds = String.Format("{0}", UserDataBase.ExecuteScalar(Command));