2015-07-11 136 views
0

我試圖在每次在TextBox中輸入字符時檢查用戶名是否存在於我的表中。這裏是我的代碼:無法使用TableAdapter啓用約束

register.aspx.cs文件我對TextBox一個TextChanged事件:

protected void username_txt_TextChanged(object sender, EventArgs e) 
{ 
    string check = authentication.checkUsername(username_txt.Text); 

    if(check == "false") 
    { 
     username_lbl.Text = "Available"; 
    } 
    else 
    { 
     username_lbl.Text = "Not Available"; 
    } 
} 

它會調用這個方法:

public static string checkUsername(string Username) 
{ 
    userInfoTableAdapters.usersTableAdapter userInfoTableAdapters = new userInfoTableAdapters.usersTableAdapter(); 
    DataTable userDataTable = userInfoTableAdapters.checkUsername(Username); 
    DataRow row = userDataTable.Rows[0]; 
    int rowValue = System.Convert.ToInt16(row["Users"]); 

    if (rowValue == 0) 
    { 
     return "false"; 
    } 
    else 
    { 
     return "true"; 
    } 
} 

正在執行的查詢是:

SELECT COUNT(username) AS Users FROM users WHERE (username = @Username) 

出於某種原因,它不斷破壞在這條線:

DataTable userDataTable = userInfoTableAdapters.checkUsername(Username); 

它提供了一個錯誤,指出:

未能啓用約束。一行或多行包含違反非空,唯一或外鍵約束的值。

只是incase,我的表中的用戶名字段是唯一的,而不是空的,我試過只是執行查詢本身,它完美的作品,所以它不在查詢結束。

有沒有人明白我在做什麼錯了?

+0

沒有人知道嗎? – mogorilla

回答

0

您的查詢不返回行 - 因此使用TableAdapter查詢返回DataTable在這種情況下不合適。

我建議使用類似下面的函數的東西來使用你的查詢。我把實際上返回布爾的自由....

public static bool checkUsername(string userName) 
{ 

SqlClient.SqlCommand withCmd = new SqlClient.SqlCommand(); 

bool result = false; 

withCmd.Connection.Open(); 

    withCmd.CommandType = CommandType.text; 
    withCmd.CommandText = "SELECT COUNT(username) AS Users FROM users WHERE (username = @Username)" 
    withCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Username", System.Data.SqlDbType.VarChar, 16)).Value = userName; 

try { 
    int intResult; 
    object scalarResult = withCmd.ExecuteScalar(); 
    if ((scalarResult != DBNull.Value) 
     && (scalarResult != null) 
     && (int.TryParse(scalarResult, out intResult))) 
        result = (intResult==1); 
} catch (Exception ex) { 
    result = false;   // hmm, bad...can't tell handle error... 
} finally { 
     // only close if we opened the connection above ... 
     withCmd.Connection.Close(); 
    } 
} 

return result; 
} 

一個TableAdapter不支持上表對象的標量查詢,當您添加並命名您的查詢,檢查查詢的性能,並確保其ExecuteMode是標量。它會返回整數值,而不是行!

TableAdapter with Scalar Query showing properties

在另一方面,如果你想保持你的結構,更改查詢實際返回row,像

SELECT uu.* AS dbo.Users uu FROM users WHERE (username = @Username)

,使checkUsername的結果( )函數取決於返回的行數(應該是1或零....)

+0

我不明白?我在Visual Studio 2010創建的項目中使用了相同的方法,我目前使用2013,所以也許他們改變了一些東西? – mogorilla

+0

我不想選擇所有的原因僅僅是因爲它只是查詢和我不需要的無關數據... – mogorilla

+0

有一種方法可以將查詢添加到TableAdapter中 - 但如果您嘗試使用DataTable userDataTable作爲結果則不行。簡單的現實是SELECT COUNT(*)不返回適合userDataTable的DataRow - 因此是約束異常。我已經更新了答案,嘗試用標量查詢來顯示TableAdapter - 但在這裏很難記錄。 – Stan