如何从单个SQL检查中产生不同的结果

时间:2016-03-27 14:37:10

标签: c# sql asp.net

我有一张表注册。我想检查文本框中的三个数据和表中的数据以查找重复数据,并且还希望为每个比较生成单独的弹出消息。即,如果已经使用了用户名,我想显示用户名存在。同样对于AdminNo和RegitrationNo。 后端代码是:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
            conn.Open();
            String str = "INSERT INTO Register (Name,AdminNo,RegisterNo,Branch,DoB,Address,Mobile,Email,Username,Password) VALUES('" + TextBoxName.Text + "','" + Convert.ToInt64(TextBoxadmin.Text) + "','" + TextBOxreg.Text + "','" + DrpBranch.SelectedItem + "','" + Convert.ToDateTime(DoB.Text) + "','" + address.Text + "','" + mobno.Text + "','" + email.Text + "','" + user.Text + "','" + pass.Text + "')";
            SqlCommand cmd = new SqlCommand(str, conn);
            cmd.ExecuteNonQuery();

这是表格的插入功能。

private bool UserExist()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);

    SqlCommand cmd = new SqlCommand("Select * From Register Where AdminNo='"+Convert.ToInt32(TextBoxadmin.Text)+"' OR Username='"+user.Text+"' OR RegisterNo='"+TextBOxreg.Text+"'"); 
    cmd.CommandType = CommandType.Text;
    cmd.Connection = conn;
    conn.Open();
    SqlDataReader rdr;
    rdr = cmd.ExecuteReader();
    if (rdr.HasRows)
    {
        return true;
    }
    else
    {
        return false;
    }
    conn.Close();
}

这是我的重复检查功能,您可以看到我使用OR运算符检查了副本。 如果发现任何重复,则返回true。 请提供一种单独查找副本并显示单独消息的方法。

3 个答案:

答案 0 :(得分:0)

我不是C ++或MS SQL的专家,但我认为这个解决方案可能有用。如果语法不正确,我很抱歉(我没有简单的方法来验证它),所以请随意根据需要进行调整,但想法如下。您可以按如下方式修改SQL语句:

select 
case
    when 
        AdminNo='"+Convert.ToInt32(TextBoxadmin.Text)+"'"
    then
        CAST(1 AS BIT)
    else 
        CAST(0 AS BIT) 
end  as AdminYes,

case
    when 
         Username='"+user.Text+"'"
    then
        CAST(1 AS BIT)
    else 
        CAST(0 AS BIT) 
end  as UsernameYes,

case
    when 
         RegisterNo='"+TextBOxreg.Text+"'"
    then
        CAST(1 AS BIT)
    else 
        CAST(0 AS BIT) 
end  as RegisterNoYes
From Register Where AdminNo='"+Convert.ToInt32(TextBoxadmin.Text)+"' OR Username='"+user.Text+"' OR RegisterNo='"+TextBOxreg.Text+"'"

您可以在:shatement

中执行此查询
SqlCommand cmd = new SqlCommand(sqlStatement); 

其中sqlStatement是我在上面发布的内容。然后当你使用阅读器时,你可以检查rdr.getBoolean(0),如果它返回true,那么这意味着你得到了管理员副本,如果你得到rdr.getBoolean(1)为真,那么它' sa用户名重复,如果你让rdr.getBoolean(3)等于true,那么它就是RegiserNo重复。

答案 1 :(得分:0)

您应该创建一个存储过程 - 并将@AdminNo,@ UserName和@RegisterNo作为参数传递。 存储过程可以返回a   - 自定义用户定义类型,
  - varchar(max),内容为xml或
  - 只是一个普通的表结果集 只要你能“传递”一个表(不是标量响应),实际格式就无关紧要了

sproc可以按照

的方式做点什么
Select 'AdminNo' as [FieldName], count(*) as [CountOfRecords] From Register Where AdminNo = @AdminNo
UNION ALL
Select 'UserName', count(*) From Register Where UserName = @UserName 
UNION ALL
Select 'RegisterNo', count(*) From Register Where RegisterNo = @RegisterNo 

然后,在UserExist例程中,您必须执行ExecuteReader并读取所有行。 您将始终有三行(一个用于AdminNo,一个用于UserName,一个用于RegisterNo),您可以在每个行中使用计数 - 如果count> 0然后有重复

答案 2 :(得分:0)

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace DemoNameSpace
{
    public class DemoClassDAL
    {
        private CheckResult UserExist()
        {
            CheckResult result = CheckResult.NoDuplicate;

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString))
            {
                SqlCommand cmd = new SqlCommand(@"select top 1
                                                    case
                                                        when AdminNo = @AdminNo  then 'AdminExists'
                                                        when Username = @UserName then 'UserExists'
                                                        when RegisterNo = @RegisterNo then 'RegisterNoExists'
                                                    end as Result
                                                  From Register");
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                conn.Open();

                var dbresult = cmd.ExecuteScalar();
                conn.Close();

                if (dbresult != DBNull.Value)
                {
                    Enum.TryParse(dbresult.ToString(), out result);
                }
            }

            return result;
        }
    }

    public enum CheckResult
    {
        NoDuplicate,
        AdminExists,
        UserExists,
        RegisterNoExists
    }
}