1

SQL データベースから特定の情報を取得して C# コードでアクセス許可チェックを行うのに苦労した後、基本に戻って適切に行う方法を学び、ゆっくりと自分のスキルを積み上げて、最終的に必要なことを実行できるようにすることにしました。する。以下のコードの目的は、現在の Active Directory ユーザーを取得し、ユーザー名やその他の情報を含む SQL テーブルに移動し、一致するものを見つけてメッセージ ボックスに表示することです。

string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString))
using (var cmd = new SqlCommand())
{
    cn.Open();
    cmd.Connection = cn;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE '@currentUser'";

    SqlParameter param = new SqlParameter();
    cmd.Parameters.Add("@currentUser", SqlDbType.Char).Value = currentUser;

    MessageBox.Show("{0}", Convert.ToString((int)cmd.ExecuteScalar()));

    cn.Close();
}

しかし、何かが間違っています。次のエラーとスタック トレースが表示されます。38 行目は MessageBox 行です。

System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

[NullReferenceException: Object reference not set to an instance of an object.]
HSE_project_Register.admin.Page_Load(Object sender, EventArgs e) in S:\IT\Development\Visual Studio Projects\HSE Project Register\admin\admin.aspx.cs:38
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

そのコードで Null 参照例外の原因は何ですか? 答えがスタックトレースにある場合、誰かが私にそれを説明してもらえますか? スタック トレースは非常に紛らわしいと思います。

4

3 に答える 3

2

クエリを次のように変更する必要があります

SELECT username FROM [tbl_Person] WHERE [username] LIKE '%' + @currentUser + '%'

また、キャスト例外は発生していませんが、null 参照例外が発生しています。

では、ページ admin.aspx.cs の 38 行目にあるものを教えてください。

クエリを次のように変更しないでください

SELECT COUNT(username) as Cnt_UserName 
FROM [tbl_Person] 
WHERE [username] LIKE '%' + @currentUser + '%'

常に Int を返す必要があります

問題は type にあると思いますSqlDbType.Char。に変更してみてくださいSqlDbType.VarChar

次のデモを見てください

SQL フィドルのデモ

LIKE (Transact-SQL)から

char および varchar データを含むパターンを使用した文字列比較では、データの格納方法が原因で、LIKE 比較に合格しない場合があります。

于 2013-06-11T04:34:55.993 に答える
2

問題はあなたのSQL文にあります

LIKE '@currentUser'"

これは、以下のようにしたほうがよいパラメータとして識別されません

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";

パラメータを設定すると

 cmd.Parameters.AddWithValue("@currentUser", '%' + currentUser + '%');
于 2013-06-11T04:41:12.573 に答える
1

次から値が返されるため、この例外が発生します。

(int)cmd.ExecuteScalar()

ですnull。しかし、ここで私が最も興味を持っているのはこれです。あなたのクエリは言う:

SELECT username FROM [tbl_Person]...

しかし、あなたはその結果を取り、それをにキャストしようとしていintます。それは私には正しくありません。これConvert.ToString((int)cmd.ExecuteScalar())は実際にはこれであるべきだと思われcmd.ExecuteScalar() as stringます。これは、 を処理するnullだけでなく、その型を適切にキャストします。

クエリを修正するには、次のコードを検討してください。

cmd.CommandText = "SELECT username FROM [tbl_Person] WHERE [username] LIKE @currentUser";

cmd.Parameters.AddWithValue("@currentUser", "%" + currentUser + "%";
于 2013-06-11T04:24:20.380 に答える