我有一个登录页面,用户有ID,ID是表中的主键。我还有一个管理员帐户,管理员可以创建用户。但是当我创建具有现有ID的用户帐户时,网页崩溃了。我想处理这种情况并发出警告,指出此ID存在且无法创建。这是我的代码:
public void CreateStudent(int ID, String status, String email, String firstName, String lastName, String password, String level, String program)
{
SqlConnection con = new SqlConnection(GetConnectionString());
string query1 = "insert into StudentTable(Name,Surname,ID,email,level,program,status,password,Type) values(@firstName,@lastName,@ID,@email,@level,@program,@status,@password,'Student')";
SqlCommand command = new SqlCommand(query1,con);
command.Parameters.AddWithValue("@firstName", firstName);
command.Parameters.AddWithValue("@lastName", lastName);
command.Parameters.AddWithValue("@ID", ID);
command.Parameters.AddWithValue("@email", email);
command.Parameters.AddWithValue("@level", level);
command.Parameters.AddWithValue("@program", program);
command.Parameters.AddWithValue("@status", status);
command.Parameters.AddWithValue("@password", password);
int result;
con.Open();
result = command.ExecuteNonQuery();
con.Close();
}
任何人都可以帮我吗? Thanls
答案 0 :(得分:1)
有多种方法。您可以捕获异常并显示错误消息。这也有助于其他错误情况,例如丢失连接。
但是,如果您希望在正常操作期间出现这种情况,则应该在没有异常的情况下处理该情况。一种方法是让您的insert
仅插入一行新的id
:
insert YourTable
(id, col1, col2, ...)
select @id
, @col1
, @col2
, ...
where not exists
(
select *
from YourTable
where id = @id
)
将参数传递给您的查询,如:
command.Parameters.AddWithValue("@id", 42);
command.Parameters.AddWithValue("@col1", "value1");
command.Parameters.AddWithValue("@col2", "value2");
现在ExecuteNonQuery()
返回受影响的行数。您可以使用它来检查insert
是否实际向表中添加了新行:
var result = command.ExecuteNonQuery();
if (result == 1)
{
lblResult.Text = "New row inserted!";
lblResult.Color = Color.Green;
}
else
{
lblResult.Text = "Failed to insert new row.";
lblResult.Color = Color.Red;
}
答案 1 :(得分:0)
不是试图处理尝试添加具有相同ID的用户而返回的错误,而是最好首先检查用户是否存在,如果可以,只创建新帐户。虽然您仍然需要处理异常以满足两个人尝试创建相同记录的情况。
所以你有以下SQL:
select * from StudentTable where ID = @newID
如果找到记录,您可以报告错误。如果找不到任何内容,那么您可以继续创建新记录。
虽然如果您使用ID作为主键,最好将其作为表中的Identity列,并在创建新行时自动增加。您仍然需要检查学生是否已经存在 - 使用电子邮件作为人类可读的唯一性条件。
如果您在电子邮件列中添加唯一性约束,那么您将能够捕获两个人尝试创建相同记录的情况。
答案 2 :(得分:0)
我已将电子邮件属性作为主键,然后检查数据库是否存在相同的电子邮件