【问题标题】:Failed to enable constraints using TableAdapters无法使用 TableAdapters 启用约束
【发布时间】:2015-07-11 14:54:24
【问题描述】:

每次在TextBox 中输入字符时,我都会尝试检查表中是否存在用户名。这是我的代码:

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);

它给出了一个错误:

未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。

以防万一,我的表中的用户名字段是唯一的并且不是空的,我尝试只执行查询本身并且它运行良好,因此它不在查询结束处。

有人明白我做错了什么吗?

【问题讨论】:

    标签: c# mysql asp.net tableadapter


    【解决方案1】:

    您的查询不返回该行 - 因此在这种情况下使用返回 DataTableTableAdapter 查询是不合适的。

    我建议将您的查询与以下函数一起使用。我冒昧地实际返回布尔值....

    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 是标量。然后它将返回整数值,而不是行!

    另一方面,如果您想保留结构,请将查询更改为实际返回 row,类似于

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

    并使 checkUsername() 函数的结果取决于返回的行数(应该是 1 或零......)

    【讨论】:

    • 我不明白?我在 Visual Studio 2010 上创建的项目中采用了完全相同的方法,我目前使用的是 2013,所以也许他们改变了一些东西?
    • 我不想全选的原因仅仅是因为它只会查询我不需要的不相关数据......
    • 有一种方法可以通过添加到 TableAdapter 的查询来执行此操作 - 但如果您尝试使用 DataTable userDataTable 作为结果,则不会。简单的现实是 SELECT COUNT(*) 不返回适合 userDataTable 的 DataRow - 因此是约束异常。我已经更新了答案以尝试使用标量查询显示 TableAdapter - 但在这里更难记录。
    • 想看看这个问题在其他地方是否有更好的答案,我在“如何:创建 TableAdapter 查询”上遇到了这个 MSDN 参考,请参阅:msdn.microsoft.com/en-us/library/kda44dwy.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多