0

私は、次のような 2 つのデータ テーブルを使用するプロシージャを作成しなければならない状況に置かれました。

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(
    @beginsWith NVARCHAR(20) = NULL,
    @SortBy nvarchar(20) = NULL,
    @sortByDirection nvarchar(5) = N'ASC'
)
AS
BEGIN

    DECLARE @searchStr NVARCHAR(21)

    IF @beginsWith IS NULL
        SET @beginsWith = N''
    ELSE
        SET @beginsWith = dbo.SuperTrim(@beginsWith);

    IF LEN(@beginsWith) > 0
        SET @searchStr = @beginsWith + N'%'
    ELSE
        SET @searchStr = N'%'

DECLARE @sqlSTR NVARCHAR(4000)
DECLARE @sqlOffice NVARCHAR(100)
DECLARE @sqlOfficeID NVARCHAR(10)
DECLARE @sqlEndSTR NVARCHAR(4000)

SET @sqlSTR = N' SELECT 
        [SESLoginID] AS LoginID
        ,[SESSuspended] AS LoginSuspended
        ,[SESAdmin] AS Role_Admin
        ,[SESLoginID]
        ,[SESFirstName]
        ,[SESLastName]
        ,[SESEmail]
        ,[SESSuspended]
        FROM sesuser.SESLogin
        WHERE SESFirstName LIKE ''' + @searchStr + ''''

SET @sqlOfficeID = N' SELECT 
        [SESLoginID]
        FROM sesuser.SESLogin
        WHERE SESFirstName LIKE ''' + @searchStr + ''''

SET @sqlOffice = N' SELECT
        [OfficeName]
        FROM sesuser.Office
        WHERE OfficeID LIKE ''' + @sqlOfficeID + ''''

SET @sqlEndSTR = @sqlSTR + @sqlOffice

PRINT @sqlEndSTR

EXEC sp_ExecuteSQL @sqlEndSTR

END

私が理解しているように、このコードは、オフィスIDと同等のオフィス名のテーブルで、オフィスIDを他のテーブルの名前に置き換えて返すことになっています。

次に、C# コードのメソッドでデータ文字列の取得を使用します。

public static DataTable GetUserList(string beginsWith, out string errMessage, string sortBy, string sortByDirection)
{
   DataTable dt = null;
   int errNum = 0;
   string sql = "[sesuser].[Login_GetUserList]";
   SqlDataAdapter adap = null;

   SqlParameter param = null;

   errMessage = "";
   SqlConnection conn = Functions.Database.DBConnect(out errNum);

   try
   {
      SqlCommand cmd = new SqlCommand(sql);
      cmd.Connection = conn;
      cmd.CommandType = CommandType.StoredProcedure;

      param = new SqlParameter("@beginsWith", SqlDbType.NVarChar, 40);
      param.Value = string.IsNullOrEmpty(beginsWith) ? "" : beginsWith.Trim();
      cmd.Parameters.Add(param);
      cmd.Parameters.AddWithValue("@SortBy", sortBy);
      cmd.Parameters.AddWithValue("@sortByDirection", sortByDirection);

      adap = new SqlDataAdapter(cmd);

      dt = new DataTable();
      adap.Fill(dt);
   }
   catch (Exception ex)
   {
      errMessage = ex.Message;
   }
   finally
   {
      Functions.Database.DBClose(conn);
   }

   return dt;
}

後でasp.netコードで、オフィス名をコールバックします

<asp:BoundField DataField="OfficeName" HeaderText="Business Unit" ReadOnly="True"  />

問題は、それが見つからないと言ってエラーになることOfficeNameです。

私が忘れたことはありますか?それとも私はそれを間違っていますか?

4

2 に答える 2

1

ストアド プロシージャが 2 つのサブセットを返すようです。

次のようにストアド プロシージャを修正します。

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(   @beginsWith NVARCHAR(20) = NULL,
    @SortBy nvarchar(20) = NULL,
    @sortByDirection nvarchar(5) = N'ASC')
AS
BEGIN    
    DECLARE @searchStr NVARCHAR(21)    
    IF @beginsWith IS NULL
        SET @beginsWith = N''
    ELSE
        SET @beginsWith = dbo.SuperTrim(@beginsWith);    
    IF LEN(@beginsWith) > 0
        SET @searchStr = @beginsWith + N'%'
    ELSE
        SET @searchStr = N'%'    
DECLARE @sqlSTR NVARCHAR(4000)    
SET @sqlSTR = N' SELECT 
         [OfficeName]
        ,[SESLoginID] AS LoginID
        ,[SESSuspended] AS LoginSuspended
        ,[SESAdmin] AS Role_Admin
        ,[SESLoginID]
        ,[SESFirstName]
        ,[SESLastName]
        ,[SESEmail]
        ,[SESSuspended]
        FROM sesuser.SESLogin
        INNER JOIN sesuser.Office
        ON sesuser.Office.OfficeID = sesuser.SESLogin.SESLoginID
        WHERE SESFirstName LIKE ''' + @searchStr + ''''    
PRINT @sqlSTR    
EXEC sp_ExecuteSQL @sqlSTR    
END
于 2011-06-23T08:53:16.277 に答える
0

クエリがクエリ文字列にある理由がわかりません。確かにうまくいくでしょう

ALTER PROCEDURE [sesuser].[Login_GetUserList]
(  
@beginsWith NVARCHAR(20) = NULL,
@SortBy nvarchar(20) = NULL,
@sortByDirection nvarchar(5) = N'ASC'
)
AS
BEGIN    
DECLARE @searchStr NVARCHAR(21)    
IF @beginsWith IS NULL
    SET @beginsWith = N''
ELSE
    SET @beginsWith = dbo.SuperTrim(@beginsWith);    
IF LEN(@beginsWith) > 0
    SET @searchStr = @beginsWith + N'%'
ELSE
    SET @searchStr = N'%'    

SELECT  [OfficeName]
    ,[SESLoginID] AS LoginID
    ,[SESSuspended] AS LoginSuspended
    ,[SESAdmin] AS Role_Admin
    ,[SESLoginID]
    ,[SESFirstName]
    ,[SESLastName]
    ,[SESEmail]
    ,[SESSuspended]
    FROM sesuser.SESLogin
    INNER JOIN sesuser.Office
    ON sesuser.Office.OfficeID = sesuser.SESLogin.SESLoginID
    WHERE SESFirstName LIKE @searchStr 

END
于 2011-06-23T11:08:35.033 に答える