C# SQL查询在SQL developer中返回行,但在asp.net中不返回行

C# SQL查询在SQL developer中返回行,但在asp.net中不返回行,c#,asp.net,oracle11g,asp.net-membership,C#,Asp.net,Oracle11g,Asp.net Membership,背景 我已使用oracle 11g配置了asp.net成员资格。在同一台计算机上配置了上的IIS和Oracle 11g express。在我将应用程序部署到IIS6之前,一切都很顺利。我的应用程序停止识别数据库中已经存在的用户。寻找解决方案使我找到了这个解决方案。我在客户端计算机上更新了Visual Studio 2010中的web.config,并将applicationName设置为与IIS上的匹配,并从数据库中删除了所有现有角色和用户记录。然后,我使用WSAT添加了一个管理员角色和用户,由

背景 我已使用oracle 11g配置了asp.net成员资格。在同一台计算机上配置了上的IIS和Oracle 11g express。在我将应用程序部署到IIS6之前,一切都很顺利。我的应用程序停止识别数据库中已经存在的用户。寻找解决方案使我找到了这个解决方案。我在客户端计算机上更新了Visual Studio 2010中的web.config,并将applicationName设置为与IIS上的匹配,并从数据库中删除了所有现有角色和用户记录。然后,我使用WSAT添加了一个管理员角色和用户,由于我还在另一个表“UserDetails”中为用户保留了一些附加信息,我在oraclesqldeveloper中运行以下查询以添加管理员详细信息

insert into UserDetails (userid, usertypeid) VALUES('BC3008FFFAD24BB995C21E80A4870ABA', 1);  
它成功地添加了记录。我为应用程序构建了部署包,并将其部署到IIS。浏览web应用程序,输入用户凭据,然后应用程序再次拒绝让我进入

我在客户机上从VS运行应用程序(不做任何更改)。 这是我的登录页面逻辑

login.aspx:

Username: <br />
<asp:TextBox runat="server" ID="txtUserName"></asp:TextBox>
<br />
Password: <br />
<asp:TextBox runat="server" ID="txtPassword" TextMode="Password"></asp:TextBox>
<br />
<asp:Button runat="server" ID="btnLogin" Text="Login" onclick="btnLogin_Click" 
    style="height: 26px" />
将断点放入
如果(Membership.ValidateUser…
显示用户正在验证,实际问题是
UserDetailsBAL.GetUserType(userid);

问题

进入GetUserType

public static int GetUserType(string userid)
    {
        DataTable dt = new DataTable();
        string q = string.Format("SELECT usertypeid from userdetails where userid='{0}'", userid);
        dt = OraDAL.Select(q);
        int usertype = -1;
        if (dt.Rows.Count != 0)
        {
            DataRow dr = dt.Rows[0];
            usertype = int.Parse(dr[0].ToString());
        }

        return usertype;
    }
然后是OraDAL。选择(q)

我注意到查询没有填充dt。我觉得一切都很好,我在sql developer中执行了相同的查询,返回了一行

为了跟踪问题,可能需要检查哪些区域

编辑

我跳过了
usertype=1
GetUserType
,以便允许管理员登录到该站点并创建usertype=2的其他用户。现在usertype=2的用户可以登录到该站点,
GetUserType
代码平稳运行,返回用户类型。我在login.aspx.cs中对代码进行了更改:

protected void btnLogin_Click(object sender, EventArgs e)
    {
        if (Membership.ValidateUser(username, password))
            {
                MembershipUser user = Membership.GetUser(username);
                FormsAuthentication.SetAuthCookie(username, false);
                Guid guserid = new Guid(user.ProviderUserKey.ToString());
                string userid = Helpers.TranslateOraceEndianUserID(guserid);
                int usertype = UserDetailsBAL.GetUserType(userid);
                if (usertype == 1)
                {
                    Response.Redirect("~/Dashboard.aspx");
                }                    
                else
                {
                    Response.Redirect("Login.aspx?error");
                }
            }
            else
            {
                Response.Redirect("Login.aspx?error");
            }            
    }
       Guid guserid = new Guid(user.ProviderUserKey.ToString());
       string userid = Helpers.TranslateOraceEndianUserID(guserid);
       int usertype = UserDetailsBAL.GetUserType(userid);
       if (usertype == 2)
       {
          Response.Redirect("~/Dashboard.aspx");
       } 
Edit2

既然数据库中有usertype为2的用户,我再次更改了上面的代码,以查看它是否再次为usertype=1给出错误

 string userid = Helpers.TranslateOraceEndianUserID(guserid);
 int usertype = UserProfilesBAL.GetUserType(userid);
 if (usertype == 1)
 {
     Response.Redirect("~/Admin/Dashboard.aspx");
 }
 else if (usertype == 2)
 {
      Response.Redirect("~/Dashboard.aspx");
 }
现在,当我为类型1的用户输入凭据时,GetUserType不返回任何内容,当我使用usertype 2的凭据登录时,GetUserType不返回用户类型,这让我更加沮丧

这两者之间的唯一区别是,对于usertype=1,我使用oracle sql developer在userdetails表中手动输入记录;对于usertype=2,当我在后端使用create user form创建usertype 2的用户时,我的代码会添加该记录

下面是我如何创建用户并输入userdetails的

MembershipCreateStatus createStatus;
MembershipUser newUser = Membership.CreateUser(txtUserName.Text, txtUserPass.Text, null, null, null, true, out createStatus);

if (newUser != null)
{
  string userid = Helpers.TranslateOraceEndianUserID(new Guid(newUser.ProviderUserKey.ToString()));

  UserDetailsBAL.AddUserDetails(userid, 2)
} 
在AddUserDetails中,我只是在用户详细信息表中插入记录


最糟糕的部分是在
OraDAL中生成的查询。选择我之前在文章中提到的方法。在asp.net中运行相同的查询时,用户类型1返回null,而我从
query
变量复制粘贴它时返回null(如上面的屏幕截图所示)into sql developer返回一行。

您的
OracleDAL.Select
方法容易出错。在这种情况下,参数值将验证为
Guid
,但如果您在其他任何地方使用该方法,则应将其重写为使用参数化查询。至于查询的问题,您是否绝对确定在ql developer,您正在使用相同的凭据连接到同一个数据库?@RichardDeeming非常感谢您花时间阅读这篇文章。首先,我将确保阅读有关SQL注入的内容,并使用参数化查询重写它。至于数据库,是的,它是同一个数据库。连接没有问题同样在字符串上。请检查更新后的帖子。从您的更新中,如果管理员用户的
UserDetails
记录确实出现问题,那么
UserDetails
记录将丢失。另一个想法是,您插入了
UserDetails
表;您的屏幕截图显示您正在查询
UserDetails
表;但是您的代码示例正在查询
userprofile
表格。这是打字错误吗?
MembershipCreateStatus createStatus;
MembershipUser newUser = Membership.CreateUser(txtUserName.Text, txtUserPass.Text, null, null, null, true, out createStatus);

if (newUser != null)
{
  string userid = Helpers.TranslateOraceEndianUserID(new Guid(newUser.ProviderUserKey.ToString()));

  UserDetailsBAL.AddUserDetails(userid, 2)
}