检查可用的用户名不起作用
Checking Username Available Doesn't Work
我有一个 asp.net 网络表单应用程序,当用户从用户名字段中跳出时,它会检查我的数据库以查看其是否可用,但我遇到的问题是它似乎总是掉落进入存在,即使它不存在。
我看了很多关于它的视频,也读了很多文章,但我根本无法让它工作。
我在下面提供了我的所有代码。
配置
<add name="PaydayLunchConnectionString1" connectionString="Data Source=********\*******;Initial Catalog=************;Integrated Security=True"
providerName="System.Data.SqlClient" />
HTML
<asp:GridView ID="tblUsers" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="SqlUsers" GridLines="None" Width="15%">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
</Columns>
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
</asp:GridView>
<asp:SqlDataSource ID="SqlUsers" runat="server" ConnectionString="<%$ ConnectionStrings:PaydayLunchConnectionString1 %>" SelectCommand="SELECT [Name] FROM [Users] WHERE [name] != 'Admin'"></asp:SqlDataSource>
<asp:Label ID="removeUserNotExist" runat="server" Text="The user entered does not exist. Please try again." Visible="false" style="color: red"></asp:Label>
<asp:Label ID="removeUserExists" runat="server" Text="The user entered exists." Visible="false" style="color: green"></asp:Label>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="txtRemoveUser" CssClass="col-sm-offset-2 col-sm-3 control-label">Enter Name To Be Removed</asp:Label>
<div class="col-sm-3">
<asp:TextBox runat="server" ID="txtRemoveUser" CssClass="form-control" AutoPostBack="true" OnTextChanged="txtRemoveUser_TextChanged" />
</div>
</div>
代码隐藏
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
protected void txtRemoveUser_TextChanged(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtRemoveUser.Text))
{
string connection = ConfigurationManager.ConnectionStrings["PaydayLunchConnectionString1"].ConnectionString;
SqlConnection conn = new SqlConnection(connection);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Name != @Name", conn);
cmd.Parameters.AddWithValue("@Name", txtRemoveUser.Text);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
removeUserNotExist.Visible = true;
removeUserExists.Visible = false;
}
else
{
removeUserNotExist.Visible = false;
removeUserExists.Visible = true;
}
}
}
数据库详细信息
Table Name = Users
Columns = ID, Name, Password
Users = Test, Test2
如果我在字段中输入 'Test' 并跳出,我会收到正确的消息(存在),但如果我随后输入 'ABC',我仍然会收到 'Exists' 消息。
如果您的数据库中有超过 1 个用户,此查询将始终生成行。因此,您的 if
语句总是产生相同的结果:
SELECT * FROM Users WHERE Name != @Name
如果要检查用户名是否存在,只需检查是否相等即可。
SELECT * FROM Users WHERE Name = @Name
如果 return 是一行,则用户名存在。否则不会。
一个更好的解决方案是在 select
中使用 1
,因为这可以防止数据库 return 所有行数据,一个小的性能改进:
SELECT 1 dummy FROM Users WHERE Name = @Name
我有一个 asp.net 网络表单应用程序,当用户从用户名字段中跳出时,它会检查我的数据库以查看其是否可用,但我遇到的问题是它似乎总是掉落进入存在,即使它不存在。
我看了很多关于它的视频,也读了很多文章,但我根本无法让它工作。
我在下面提供了我的所有代码。
配置
<add name="PaydayLunchConnectionString1" connectionString="Data Source=********\*******;Initial Catalog=************;Integrated Security=True"
providerName="System.Data.SqlClient" />
HTML
<asp:GridView ID="tblUsers" runat="server" AutoGenerateColumns="False" CellPadding="4" DataSourceID="SqlUsers" GridLines="None" Width="15%">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
</Columns>
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" />
</asp:GridView>
<asp:SqlDataSource ID="SqlUsers" runat="server" ConnectionString="<%$ ConnectionStrings:PaydayLunchConnectionString1 %>" SelectCommand="SELECT [Name] FROM [Users] WHERE [name] != 'Admin'"></asp:SqlDataSource>
<asp:Label ID="removeUserNotExist" runat="server" Text="The user entered does not exist. Please try again." Visible="false" style="color: red"></asp:Label>
<asp:Label ID="removeUserExists" runat="server" Text="The user entered exists." Visible="false" style="color: green"></asp:Label>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="txtRemoveUser" CssClass="col-sm-offset-2 col-sm-3 control-label">Enter Name To Be Removed</asp:Label>
<div class="col-sm-3">
<asp:TextBox runat="server" ID="txtRemoveUser" CssClass="form-control" AutoPostBack="true" OnTextChanged="txtRemoveUser_TextChanged" />
</div>
</div>
代码隐藏
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
protected void txtRemoveUser_TextChanged(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtRemoveUser.Text))
{
string connection = ConfigurationManager.ConnectionStrings["PaydayLunchConnectionString1"].ConnectionString;
SqlConnection conn = new SqlConnection(connection);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Name != @Name", conn);
cmd.Parameters.AddWithValue("@Name", txtRemoveUser.Text);
SqlDataReader rd = cmd.ExecuteReader();
if (rd.HasRows)
{
removeUserNotExist.Visible = true;
removeUserExists.Visible = false;
}
else
{
removeUserNotExist.Visible = false;
removeUserExists.Visible = true;
}
}
}
数据库详细信息
Table Name = Users
Columns = ID, Name, Password
Users = Test, Test2
如果我在字段中输入 'Test' 并跳出,我会收到正确的消息(存在),但如果我随后输入 'ABC',我仍然会收到 'Exists' 消息。
如果您的数据库中有超过 1 个用户,此查询将始终生成行。因此,您的 if
语句总是产生相同的结果:
SELECT * FROM Users WHERE Name != @Name
如果要检查用户名是否存在,只需检查是否相等即可。
SELECT * FROM Users WHERE Name = @Name
如果 return 是一行,则用户名存在。否则不会。
一个更好的解决方案是在 select
中使用 1
,因为这可以防止数据库 return 所有行数据,一个小的性能改进:
SELECT 1 dummy FROM Users WHERE Name = @Name