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

时间:2017-05-23 19:39:29

标签: c# sql sqlcommand

    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表中已存在的重复项除外。使用当前代码我不会遇到任何错误,但在我的Student表上,即使当前没有重复项,也会插入一行空值。

我想要做的是将Temp_Student中的2列插入到学生中而不重复,目前这是我被另一个传递的代码的一部分。我真的不太了解这一点。如果还有其他方式,请向我建议。谢谢

1 个答案:

答案 0 :(得分:1)

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

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

外部联接返回Temp_Student中的所有记录,无论Student中是否有匹配的记录。如果Student中没有匹配的记录,则从该表中选择的列为空。因此,通过根据此加入进行选择,我们只返回Temp_StudentStudent中未匹配的记录。

您还可以使用MERGE语句。许多在2008年之前编写SQL的人习惯于以“旧”的方式来做这件事,但这更明确。

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);

MERGE必须以分号结束。从技术上讲,所有语句都应该是,但SQL会在MERGE上强制执行。

相关问题