2009-07-01 48 views
0

我使用以下的StoredProcedureIF EXISTS存儲過程

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 


Alter PROCEDURE [dbo].[GetUserDetailsByUserID] 
(
    @UserId varchar(100) 
) 
AS 
BEGIN 

    IF EXISTS(Select * from Registration where [email protected]) 
     BEGIN 
      Select 
        [Name], 
        [UserId], 
        [PermanentAddress], 
        [TemporaryAddress], 
        [OfficePhoneNo], 
        [ResidentialPhoneNo], 
        [MobileNo], 
        [Email], 
        [ContactPerson], 
        [C_OfficePhoneNo], 
        [C_ResidentialPhoneNo], 
        [C_MobileNo], 
        [C_Email], 
        [Project], 
        [TotalAmount] 
      From 
       Registration 
      Where 
       [email protected] 

     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 

如果在登記表中不存在對應於用戶ID的信息,db.ExecuteDataSet(DbCommand).Tables(0)示出了一個錯誤如cannot find Table(0)。爲了擺脫這個錯誤,我需要對這個過程進行哪些修改?

回答

3

您可以簡單地擺脫如果存在。當記錄不存在,你會得到一個空表(我認爲這是你想要什麼,看你的示例代碼)

1

該過程不會總是返回記錄集。如果沒有記錄集,則Tables將爲空,並且Tables(0)將失敗並返回錯誤。您應該只返回選擇而不是隻選擇記錄是否存在。您的代碼然後可以檢查返回的空記錄集。

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 

此外,刪除存儲過程中存在的如果存在,因爲如果該行存在,您將強制數據庫在表中搜索兩次以查找UserId = @ UserID所在的記錄。