2

我有这个存储过程

create PROCEDURE spgetoutpatientidbyinpatientid
@pinpatientid int
AS

BEGIN

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

如果这种情况是错误的,我得到空异常。我想返回至少空值或任何东西。我怎样才能避免这个错误。在我的代码中我使用

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

如何更改我的 sql 查询..?或者我怎样才能避免这个异常

4

5 回答 5

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
于 2012-10-26T08:19:37.253 回答
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 )
于 2012-10-26T08:21:30.850 回答
0

来自 C#

string ds = "";
object val = UserDataBase.ExecuteScalar(Command);
if(val != null)
   ds = val.ToString();
于 2012-10-26T08:22:47.170 回答
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等)在哪里。如果有零个或多个匹配项,则使用 LINQSingle()将自动引发异常。否则,activePatient将包含返回的列。请注意,您可以<int>在此处替换<Patient>为使其填充整个对象模型。

于 2012-10-26T08:51:45.247 回答
-1
string  ds = String.Format("{0}", UserDataBase.ExecuteScalar(Command));
于 2012-10-26T08:27:15.533 回答