0

認証がこのようにパスした場合にユーザートークンを返すストアドプロシージャがあります

BEGIN
SET FMTONLY OFF --Tricky Part
DECLARE @token uniqueidentifier
DECLARE @user_id as int
SET @user_id = (SELECT UserID  FROM Users
WHERE @email = Email AND @password = PasswordKey)
IF @user_id IS NOT NULL
BEGIN
    SET @token = NEWID()
    UPDATE Users SET Token = @token
    WHERE UserID = @user_id
    SELECT * FROM Users WHERE UserID = @user_id
END
END

それがなければSET FMTONLY OFFトークンを返しますが、ユーザーが正しいカーディナリティを入力した場合にのみ、それ以外の場合はエラーが発生します

タイプ 'Token' のメンバーには、データ リーダーに同じ名前の対応する列がありません。

発生します。

Productこれで、ストアド プロシージャに渡す ID によって決定される単一の値を返す別のストアド プロシージャ (これとほぼ同じ) があり、存在しないものを送信しても正常に動作します。関数のインポートでは、ストアド プロシージャの 1 つで返される列が表示され、別のストアド プロシージャでは返されない列が表示されます。わかりやすくするために、ストアド プロシージャと関数のインポートを示す 2 つの画像を次に示します

4

1 に答える 1

0

使用する代わりに:

SELECT * FROM Users WHERE UserID = @user_id

SELECT * を使用するだけでなく、Users テーブルから返したい列の名前をリストします。

SELECT ColumnName,
       AnotherColumn,
       YouGetThePoint
FROM  ...

DataReader には、予想される列名とは異なる列名が設定されているようです。任意の名前 (T1、T2 など) が付けられている場合は、デバッガーを使用したり、プロシージャから返される実際の列名をリストしたりしましたか。

于 2013-01-07T03:43:53.010 に答える