我有这个存储过程
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查询..?或者我该如何避免这种异常
答案 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));