2009-07-01 3 views
0

Я использую следующий 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 [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 

Если детали, соответствующие идентификатор пользователя не существует в регистрации таблице, db.ExecuteDataSet(DbCommand).Tables(0) показывает одну ошибки как cannot find Table(0). Какая модификация в укороченной процедуре я должен сделать, чтобы избавиться от этой ошибки?

ответ

3

Вы можете просто избавиться от IF EXISTS. Если запись не существует, вы получите пустую таблицу (который я думаю, что вы хотите, глядя на примере кода)

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.

Смежные вопросы