2017-11-30 12 views
0

私はC#の初心者です。私はストアドプロシージャを呼び出すことはできません。ストアドプロシージャを呼び出せません

私のストアドプロシージャがこれです:私のC#コードで

CREATE PROCEDURE USP_login 
    @us VARCHAR(20), 
    @pwd VARCHAR(20) 
AS 
BEGIN TRAN 
    BEGIN TRY 
     SELECT * 
     FROM dbo.KhachHang 
     WHERE tenDangNhap = @us AND matKhau = @pwd 
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRAN 
     RETURN 0 
    END CATCH 

    COMMIT TRAN 
    RETURN 1 
GO 

、私はUSP_loginストアドプロシージャを呼び出すために、この機能を使用するが、それは動作しません:

public bool loginStored(string us, string pwd) 
{ 
    object[] sqlParams = 
    { 
     new SqlParameter ("@userName", us), 
     new SqlParameter ("@passWord", pwd), 
    }; 

    var rs = db.Database.SqlQuery<bool>("USP_login @userName, @passWord", sqlParams).SingleOrDefault(); 
    return rs; 
} 

スクリーンショットでのエラーメッセージ:

Error Message

+0

エラーは何が間違っているかを伝えています.Configファイルの接続文字列が正しく設定されていますか?単純なSelectクエリに対してトランザクションやロールバックは必要ありません。SELECT * FROM dbo.KhachHang where tenDangNhap = @ us AND matKhau = @ pwd'基本的なSqlクエリの実行方法や、あなたが複雑なlinqを好きでなければ、Select *は '1つの条件を探しているか1列しかチェックしていない場合は、パフォーマンスに関して意味します。 – MethodMan

+0

'var'は使わないでください。この場合、varを使う必要はありません。変数を適切に定義した場合は、実行時エラーよりも修正が容易なコンパイラエラーが発生します。 '例外の詳細をクリップボードにコピーする'を押し、メモ帳に貼り付けると、スタックトレースのエラーメッセージが表示されます。 – jdweng

答えて

3

e SELECT * ...は、単一のbool以上のものを返しています。 (。クエリに基づいて、はっきりと表には少なくとも二つのフィールド、tenDangNhapmatKhauを持っている)しかし、それはあなたが期待するコードを語ったものです:

db.Database.SqlQuery<bool>(/.../) 

選択するかだけの列が希望:

SELECT SomeBooleanValue FROM dbo.KhachHang WHERE [email protected] AND [email protected] 

それともは(あなたが定義する必要がカスタムクラスであってもよい)レコードごとに期待できる正しいタイプを指定します

関連する問題