0

ユーザーのデータを取得するための Web サービス メソッドを作成しています。明確にするために、ID、fName、lName、emailAddress、username、password、reg_ID を含む User というテーブルがデータベースにあります。ID を使用してデータを取得した場合は機能しますが、代わりに「where」句で emailAddress を使用すると、次のエラーが発生します。

ウェブサービス方式

 [WebMethod(Description = "Returns Details of User with username")]
        public DataSet GetUser(string user)
        {
            DataSet dataSet = new DataSet();
            OleDbConnection oleConn = new OleDbConnection(connString);

            try
            {
                oleConn.Open();
                string sql = "SELECT * FROM [User] WHERE [username]=" + user;
                OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, oleConn);
                dataAdapter.Fill(dataSet, "User");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                oleConn.Close();
            }
            if (dataSet.Tables["User"].Rows.Count <= 0)
                return null;

                return dataSet;
        }

エラー

System.NullReferenceException: Object reference not set to an instance of an object.
   at UserManagement.UserRegistration.GetUser(String user) in C:\Users\smartamrit\Desktop\SystemSoftware\UserManagement\UserRegistration.asmx.cs:line 170

170行目 if (dataSet.Tables["User"].Rows.Count <= 0)

4

2 に答える 2

0

クエリが行を返さない場合、テーブルは DataSet に追加されません。したがって

dataSet.Tables["User"]

おそらくnullです。

Fill メソッドの戻り値をチェックして、行が返されたことを確認する必要があります。

MSDNのドキュメントによると、fill メソッドは以下を表す整数を返します。

DataSet に正常に追加または更新された行の数。これには、行を返さないステートメントの影響を受ける行は含まれません。

さらに、クエリは sql インジェクション (セキュリティの脆弱性) に対してオープンです。代わりにパラメーター化されたクエリを使用するように変更する必要があります。

于 2012-10-19T17:10:55.927 に答える
0

メール ID を渡すときに一重引用符を使用しましたか、またはメール ID を渡すときに like ステートメントを使用しようとしましたか。catch ブロックで例外が発生するかどうかを確認しましたか。

考えられる理由は、catch ブロックで例外が発生した可能性があり、それが抑制された後、if ステートメントが実行され、ユーザー テーブルが見つからないというエラーがスローされたことです。

于 2012-10-19T17:40:13.970 に答える