2015-11-06 25 views
0

我有一個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; 
     } 
    } 
} 

DB詳細

Table Name = Users 
Columns = ID, Name, Password 
Users = Test, Test2 

如果我在字段中輸入和標籤進行「測試」,我得到正確的信息(存在),但如果我再進入「ABC」我仍然得到「存在」的消息。

回答

1

如果數據庫中有多個用戶,則此查詢將始終生成行。因此,您的if語句總是產生相同的結果:

SELECT * FROM Users WHERE Name != @Name 

如果你想檢查用戶名存在,只是檢查是否相等。

SELECT * FROM Users WHERE Name = @Name 

如果那一個返回一行,則存在用戶名。否則它不會。

一個更好的解決辦法是在select使用1,因爲這會阻止數據庫返回的所有行的數據,一個小的性能改進:

SELECT 1 dummy FROM Users WHERE Name = @Name 
+0

廣東話相信這是那麼容易。只是有一點盲目的代碼,無法讓我的頭繞過我所做的事情 – murday1983