0

我正在编写 Web 服务方法来检索用户的数据。为了清楚起见,我的数据库中有一个名为 User 的表,其中包含 ID、fName、lName、emailAddress、用户名、密码、reg_ID。如果我使用 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"]

可能为空。

您需要检查 Fill 方法的返回值以确保返回了行。

根据MSDN 文档,fill 方法返回一个整数,它表示:

在 DataSet 中成功添加或刷新的行数。这不包括受不返回行的语句影响的行。

此外,您的查询对 sql 注入开放(一个安全漏洞)。您需要将其更改为使用参数化查询

于 2012-10-19T17:10:55.927 回答
0

您是否在传递电子邮件 ID 时使用了单引号,或者在传递电子邮件 ID 时尝试使用 like 语句。您是否检查了 catch 块中是否引发了任何异常。

可能的原因是catch块中可能发生异常,它被抑制,然后if语句执行并抛出未找到用户表的错误。

于 2012-10-19T17:40:13.970 回答