我正在使用以下storedprocedure
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
Alter PROCEDURE [dbo].[GetUserDetailsByUserID]
(
@UserId varchar(100)
)
AS
BEGIN
IF EXISTS(Select * from Registration where UserId=@UserID)
BEGIN
Select
[Name],
[UserId],
[PermanentAddress],
[TemporaryAddress],
[OfficePhoneNo],
[ResidentialPhoneNo],
[MobileNo],
[Email],
[ContactPerson],
[C_OfficePhoneNo],
[C_ResidentialPhoneNo],
[C_MobileNo],
[C_Email],
[Project],
[TotalAmount]
From
Registration
Where
UserId=@UserId
END
END
我在vb中使用以下代码
Public Function GetUserDetailsByUserID(ByVal strUserId As String) As DataTable
Try
Dim db As Database = DatabaseFactory.CreateDatabase()
Dim DbCommand As DbCommand = _
db.GetStoredProcCommand("GetUserDetailsByUserID")
db.AddInParameter(DbCommand, "@UserId", DbType.String, strUserId)
Return db.ExecuteDataSet(DbCommand).Tables(0)
Catch ex As Exception
Return New DataTable()
End Try
End Function
如果注册表中不存在与userid相对应的详细信息,db.ExecuteDataSet(DbCommand).Tables(0)
会将一个错误显示为cannot find Table(0)
。我想要摆脱这个错误的主要程序有什么修改?
答案 0 :(得分:3)
您可以简单地摆脱 IF EXISTS 。当记录不存在时,您将获得一个空表(我认为这就是您想要的,查看您的示例代码)
答案 1 :(得分:1)
该过程不会始终返回记录集。如果没有记录集,则Tables
将为空,Tables(0)
将失败并返回错误。您应该只返回选择而不是仅选择记录是否存在。然后,您的代码可以检查返回的空记录集。
答案 2 :(得分:0)
在VB代码中,更改
Return db.ExecuteDataSet(DbCommand).Tables(0)
到
Dim Ds as DataSet = db.ExecuteDataSet(DbCommand)
If Ds.Tables.Count = 1 Then
Return Ds.Tables(0)
Else
Return New DataTable()
End If
此外,从存储过程中删除 If Exists ,因为如果该行存在,您将强制数据库在表中搜索两次UserId = @ UserID的记录。