无法使用TableAdapter启用约束
我试图在每次在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,我的表中的用户名字段是唯一的,而不是空的,我试过只是执行查询本身,它完美的作品,所以它不在查询结束。
有没有人明白我在做什么错了?
您的查询不返回行 - 因此使用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
是标量。它会返回整数值,而不是行!
在另一方面,如果你想保持你的结构,更改查询实际返回row
,像
SELECT uu.* AS dbo.Users uu FROM users WHERE (username = @Username)
,使checkUsername的结果( )函数取决于返回的行数(应该是1或零....)
我不明白?我在Visual Studio 2010创建的项目中使用了相同的方法,我目前使用2013,所以也许他们改变了一些东西? – mogorilla
我不想选择所有的原因仅仅是因为它只是查询和我不需要的无关数据... – mogorilla
有一种方法可以将查询添加到TableAdapter中 - 但如果您尝试使用DataTable userDataTable作为结果则不行。简单的现实是SELECT COUNT(*)不返回适合userDataTable的DataRow - 因此是约束异常。我已经更新了答案,尝试用标量查询来显示TableAdapter - 但在这里很难记录。 – Stan
没有人知道吗? – mogorilla