C# 存储过程中的if-else语句逻辑问题
我的存储过程中有多个C# 存储过程中的if-else语句逻辑问题,c#,sql,asp.net,C#,Sql,Asp.net,我的存储过程中有多个IF…ELSE语句,但显然一次只能使用两个 存储过程: IF EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username) IF NOT EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b) BEGIN select 0 INSERT INTO [registe
IF…ELSE
语句,但显然一次只能使用两个
存储过程:
IF EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
IF NOT EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
BEGIN
select 0
INSERT INTO [registered]
([Username]
,[CreatedDate]
,[eventname])
VALUES
(@Username
,GETDATE()
,@b)
END
ELSE IF NOT EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
BEGIN
SELECT -1 -- invalid user
END
ELSE IF EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
BEGIN
SELECT -2 -- username
END
使用一个开关盒(仅使用-2
和0
,完全忽略-1
)的包含3条不同消息的预发布页面。
如果用户不存在,它不会选择-1
它只是带着会话值转到post over页面,即使它不正确
protected void RegisterUser(object sender, EventArgs e)
{
int userId = 0;
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("Insert_User"))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
con.Open();
Session["username"] = txtUsername.Text;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Username", txtUsername.Text.Trim());
cmd.Parameters.AddWithValue("@b", DropDownList1.SelectedValue.ToString());
if (!DBNull.Value.Equals(cmd.ExecuteScalar()))
{
userId = Convert.ToInt32(cmd.ExecuteScalar());
}
}
string messages = string.Empty;
switch (userId)
{
case 0:
Response.Redirect("userinfo.aspx", false);
break;
Label2.Text = Convert.ToString(userId);
case -1:
messages = "invalid user";
Label2.Text = Convert.ToString(userId);
break;
case -2:
messages = "You've already registered!";
Label2.Text = Convert.ToString(userId);
//Label2.Text = messages;
break;
}
}
}
}
已发布页面的代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Convert.ToString(Session["username"]);
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
using (SqlCommand scmd = new SqlCommand())
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
scmd.Connection = con;
scmd.CommandType = CommandType.Text;
scmd.Parameters.Add("@b", SqlDbType.NVarChar).Value = Label1.Text;
scmd.CommandText = "SELECT * FROM registered where username = @b";
con.Open();
}
}
}
答复布伦丹:
select--1无效用户
没有被执行,它被发布到下一页,这意味着case-1
被忽略
然而,过程的第一个if-else语句有点奇怪,在数据库端,它工作正常,在插入值之前正确地检查了条件
但是case 0
不起作用,它会触发case-2
变量:
@用户名=用户名
@b=事件名称
注册用户列:用户名、事件名称
我正在检查用户是否存在于registeredusers
表中,而不存在于registeredusers
中,因此将两个if语句放在一起 (仅使用-2和0,-1被完全忽略)。如果用户不存在,它不会选择-1。这背后的原因是第一句话,即:
IF EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
如果您正在检查条件是否存在,请继续。若用户不存在,它将如何进入其他语句。你可以写一个类似的其他部分
IF EXISTS(SELECT userid FROM registeredusers WHERE Username = @Username)
BEGIN
IF NOT EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
BEGIN
INSERT INTO [registered]
([Username]
,[CreatedDate]
,[eventname])
VALUES
(@Username
,GETDATE()
,@b)
select 0
END
ELSE IF EXISTS(SELECT userid FROM registered WHERE Username = @Username and eventname = @b)
BEGIN
SELECT -2 -- username
END
END
ELSE
BEGIN
SELECT -1 -- invalid user
END
你能提供更多的细节吗?如果没有执行过程中的哪个
,对于给定的代码块,变量是什么(例如@Username
)以及注册表项的内容是什么表?添加了对主帖子的回复,以便更容易看到现在使用了案例-2和-1。案例0被忽略。数据库仍在正确插入值,但未选择0。首先在IF NOT EXISTS块中写入insert语句,然后写入select语句,如select 0Not working still,它只是忽略select 0,然后跳到-2。(IMO)感觉它在循环,它永远不会跳到0。因此,与插入后一样,它将再次循环语句,覆盖0并转到-2(因为用户现在存在)。您是否可以编写打印语句,而不是通过执行存储过程在输出窗口中选择和检查输出(根据需要传递不同的参数)在数据库中,查看它发生的原因。我在我的末端尝试了相同的方法,并按预期工作。