2009-06-09 26 views
0

です。SqlClient.ExecuteScalarメソッドを使用してテーブルからIDを返す次のコードがあります。SqlCommand.ExecuteScalarはnullを返しますが、未処理のSQLは

using (var conn = new SqlConnection(connectionString)) 
using (var cmdContrib = new SqlCommand("SELECT ContributorId FROM Contributor WHERE Code='" + folderSystem.ContributorCode + "'", conn)) 
{ 
    conn.Open(); 
    var contribId = cmdContrib.ExecuteScalar(); 
} 

元々は動作していましたが、現在contribIdはnullです。私はProfilerから抽出した後、管理スタジオでSQLをテストし、期待どおりにIDを返しました。

次のコマンドを追加して、別のテーブル(製品)からIDを取得しました。
contribIdがnullのままである間、productIdはnullではありません。

using (var conn = new SqlConnection(connectionString)) 
using (var cmdContrib = new SqlCommand("SELECT ContributorId FROM Contributor WHERE Code='" + folderSystem.ContributorCode + "'", conn)) 
using (var cmdTest = new SqlCommand("SELECT productId FROM Product WHERE [filename] = 'bda00001.jpg'", conn)) 
{ 
    conn.Open(); 
    var contribId = cmdContrib.ExecuteScalar(); 
    var productId = cmdTest.ExecuteScalar(); 
} 

私はそれが明らかなものであると私はそれに気付いていないために自分を蹴るだろう確信しているが、今の私は困惑。使用プロファイラは確認する

+0

folderSystem.ContributorCodeのデバッグ値は何ですか? –

+0

folderSystem.ContributorCodeにはどのような値が含まれていますか?私はこれがSQLインジェクションのバグ(例えば、変数の値の一重引用符)であることに賛成しています。 –

+0

cmdTestと同様に、静的SQLクエリを使用してcmdContribを作成し、何が起こるかを確認します。問題があなたに飛び火するかもしれません。 –

答えて

3

A)返される行数は、(私はそれが Cには何データベース0) B))のログイン/ユーザーコンテキストが何であるかを疑います。 D)SQLコマンドの実際の内容は何ですか?

このコマンドを抽出し、同じデータベースで再実行して値を返すことを確認します。これが成功した場合は、実行コンテキストを、Profilerが接続が実行されていると言ったものに変更し、もう一度やり直してください。今失敗した場合は(0行を返します)、ソース表(コントリビュータ)が実際に行レベルのセキュリティを実装しているビューかどうかを確認します。

+0

"C)そのログイン/ユーザーコンテキスト" +1、それはアプリケーションが別のコンテキストで実行されていることは非常に簡単です – tekBlues

+0

これは別のデータベースでした(恥ずかしい)この答えはこのカテゴリのチェックリストとして役立ちます質問。 – Pauly

+0

心配する必要はありません。遅かれ早かれ、私たち全員に起こります。 – RBarryYoung

関連する問題