C# 如何使用c代码检查sql表中是否存在特定项?

C# 如何使用c代码检查sql表中是否存在特定项?,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我想检查一个CNIC no.tat用户输入的是否在我的表中不存在,然后我不希望他继续注册过程 这是代码,其中一部分不起作用。。我错在哪里 con.Open(); string cmdStr = "Select count(*) from Registration where UserName='" + TextBoxUN.Text + "'"; string cmdCnic = "Select count(*) from List_CNIC where CNIC=

我想检查一个CNIC no.tat用户输入的是否在我的表中不存在,然后我不希望他继续注册过程

这是代码,其中一部分不起作用。。我错在哪里

con.Open();
        string cmdStr = "Select count(*) from Registration where UserName='" + TextBoxUN.Text + "'";
        string cmdCnic = "Select count(*) from List_CNIC where CNIC='" + TextBoxCNIC.Text + "'";
        SqlCommand userExist=new SqlCommand(cmdStr, con);
        SqlCommand cnicExist=new SqlCommand(cmdCnic,con);
        int temp=Convert.ToInt32(userExist.ExecuteScalar().ToString());
        int tempCnic = Convert.ToInt32(cnicExist.ExecuteScalar().ToString());
        con.Close();
        if (temp==1)
        {
            Session["name1"] = TextBoxFN.Text;
            Session["UserName"] = TextBoxUN.Text;
            Response.Redirect("Error.aspx");
        } 
       if (!(tempCnic==1))
        {
            Session["nameFull"] = TextBoxFN.Text;
            Session["CNIC"] = TextBoxCNIC.Text;
            Response.Redirect("Error_InvalidCNIC.aspx");

        }
我检查用户名是否存在的代码部分工作正常,但检查tempCnic。即使用户未输入任何内容,它也会自动重定向到页面错误_InvalidCNIC.aspx


代码有什么问题?

我喜欢实体框架,所以这可能不是你的答案,但。。。。你可能会感兴趣

var stuff = List_CNIC.Where(p => p.CNIC == TextBoxCNIC.Text);
if(stuff.Count() == 1) {
    //do your stuff
}  

我将创建一个存储过程,根据插入成功返回不同的代码,并从您的C代码中执行它

CREATE PROC RegisterUser
    @UserName nvarchar(255),
    @CNIC nvarchar(255)
AS
BEGIN
    IF EXISTS (SELECT * FROM  Registration WHERE UserName = @UserName)
    BEGIN
        RETURN -1
    END
    ELSE
    BEGIN
        IF EXISTS (SELECT * FROM List_CNIC WHERE CNIC = @CNIC)
        BEGIN
            RETURN -2
        END
        ELSE
        BEGIN
            --Insert into relevant tables, ideally wrapped in a TRANSACTION with try/catch
            RETURN 1
        END
    END
END
然后,我将此存储过程拖到LINQ to SQL datacontext上,并按如下方式执行:

var db = new DataContextDataClasses();
var result = db.RegisterUser(userName,CNIC);

switch (result) {
    case 1:
         //success
         break;
    case -1:
         //user exists
         break;
    case -2:
         //CNIC exists
         break
    default:
         throw new Exception("Unknown error occurred");
}

但是你也可以通过ADO.NET调用它…

我看不出有什么问题。如果用户没有输入任何内容,则

从列表中选择count*,其中CNIC=应设置tempCnic=0

除非有一行CNIC是空字符串

正如你所说,这一块被触发了

if (!(tempCnic==1))
        {
            Session["nameFull"] = TextBoxFN.Text;
            Session["CNIC"] = TextBoxCNIC.Text;
            Response.Redirect("Error_InvalidCNIC.aspx");
    }
因为!0==1表示为真

它正在做你要求它做的事情


顺便说一句:如果你把这张支票写成tempCnic的话,它会更容易阅读=1

顺便说一句:该代码中存在SQL注入漏洞。这个网站很容易被黑客入侵。你是否尝试过在SSMS中运行查询Select count*from List_CNIC where CNIC=以查看它是否返回你认为会返回的值?或者通过调试器运行代码并检查TEMPCNICT的返回值OP没有询问如何在EF的LINQ中重写查询。为什么要使用count而不是if存在?可能存在,因为计数必须执行完整扫描,而存在将在第一次匹配后返回。可能不是用户名的问题,因为如果用户名是唯一的,或者PK将是一个非常有效的扫描,但是我们不知道另一个表是什么样子。既然存在不可能更糟,那就是我一直使用的。是的,有道理。我知道在这种情况下,EXISTS会更好。。。已更新以显示此信息,但看起来不会使用此解决方案。您不知道。OP还没有决定使用哪种解决方案(如果有的话)。你的输入即使对OP没有帮助,也可能在今天和将来对其他读者有所帮助。所以不要觉得你的信息是浪费。一旦你切换到EXISTS,我就把它升级了-@AaronBertrand我只是想知道,当用户甚至没有在CNIC文本框中输入任何内容时,它会自动重定向到页面错误_InvalidCNIC.aspx。。这就是我要找的。。。CNIC是一个13位数字,已保存为varchar50类型。请看。。。点击链接点击这里注册,注册表格应该是打开的,在这个表格中,用户将输入用户名和cnic,当我只执行用户名检查时,如果它已经存在于注册选民数据库中,请将他重定向到错误页面。。。我扩展了代码,但这一次我想,如果用户输入的CNIC尚未存储在数据库中,那么他就没有资格注册到这个特定站点,这就是为什么当checkd userName使用iftemp==1时,CNIC使用iftempnic=1,考克斯他们是2相反的情况问题是点击这里注册。。注册表根本没有打开,它正在将我的页面重定向到Error_InvalidCNIC.aspx..您需要包含与您的问题相关的所有代码,并更具体地说明您在寻找什么。我的回应是,即使用户没有输入任何内容,它也会自动重定向到页面错误\u InvalidCNIC.aspx。我只是想知道它是否会自动重定向到页面错误\u InvalidCNIC.aspx。。这就是我要找的。。。CNIC是一个13位数字,已保存为varchar50类型。