C# C sqlcommand如果不存在代码错误

C# C sqlcommand如果不存在代码错误,c#,sql,sqlcommand,C#,Sql,Sqlcommand,目前,我正在尝试将数据从临时学生表插入学生表,但学生表中已经存在的重复数据除外。对于当前代码,我没有遇到任何错误,但是在我的Student表上,插入了一行空白值,即使当前没有重复的值 我想做的是从Temp_Student向Students插入两列,而不重复,目前这是代码的一部分,我在代码中被另一列传递。我真的不太明白这一点。如果还有其他方法,请也向我建议。谢谢我不知道您表中的确切列,但是您可以根据实际列进行调整,假设Student_Name是您的主键 public void Test2(

目前,我正在尝试将数据从临时学生表插入学生表,但学生表中已经存在的重复数据除外。对于当前代码,我没有遇到任何错误,但是在我的Student表上,插入了一行空白值,即使当前没有重复的值


我想做的是从Temp_Student向Students插入两列,而不重复,目前这是代码的一部分,我在代码中被另一列传递。我真的不太明白这一点。如果还有其他方法,请也向我建议。谢谢

我不知道您表中的确切列,但是您可以根据实际列进行调整,假设Student_Name是您的主键

    public void Test2()
    {
        string consString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(consString))
        {
            con.Open();
            SqlCommand com = new SqlCommand("select * from Temp_Student", con);
            SqlDataReader reader = com.ExecuteReader();

            while (reader.Read())
            {
                string sql = "IF NOT EXISTS (SELECT s_name FROM Student WHERE s_name = @chp1) BEGIN INSERT INTO Student(s_name, s_pass) values(@chp1, @chp2) END";

                string test = "";

                SqlCommand com1 = new SqlCommand(sql, con);
                com1.Parameters.AddWithValue("@chp1", test);
                com1.Parameters.AddWithValue("@chp2", test);
                com1.ExecuteNonQuery();

            }
            con.Close();
        }
    }
外部联接返回Temp_Student中的所有记录,无论Student中是否有匹配的记录。如果Student中没有匹配的记录,则从该表中选择的列为空。因此,通过基于此联接进行选择,我们只返回Temp_Student中与Student中不匹配的记录

您也可以使用语句。很多在2008年之前编写SQL的人已经习惯了用老方法来编写SQL,但这更为明确

insert into Student
select 
    tmp.Student_Name, tmp.Student_Pass
from
    Temp_Student tmp
    outer join Student stn on tmp.Student_Name = stn.Student_Name
where stn.Student_Name is null

合并必须以分号终止。从技术上讲,所有语句都应该是空的,但SQL在合并时强制执行。

什么是黑值?变量测试设置为空值。检查该值是否存在。如果该值不存在,则为user和password插入一个空白值,然后重复循环直到读卡器结束,但此时添加了一个空行。您真正想要用于测试的值是什么?我想读者指出的当前记录的值。打字很好。黑色=>空白。编辑。我认为@Steve是正确的。我想补充一点,这似乎是一个非常复杂的方法。您的代码将运行n+1查询,其中n是temp_student中的记录数。为什么不一次运行一个MERGE命令来完成这一切,而不是使用迭代的方法呢?因为之后,我需要提示用户是否要更新或删除重复的值,因此我只想先添加非重复的值
MERGE Students AS T
USING Temp_Students AS S
ON (T.Student_Name= S.Student_Name) 
WHEN NOT MATCHED BY TARGET  
    THEN INSERT(Student_Name, Student_Pass) VALUES(S.Student_Name, S.Student_Pass);