2017-05-23 28 views
0
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(); 
     } 
    } 

現在、私は、Studentテーブルに既に存在する重複を除いて、StudentテーブルにTemp_studentテーブルからデータを挿入しようとしています。現在のコードではエラーは発生しませんが、Studentテーブルには重複していない空白値が挿入されています。C#sqlcommand存在しない場合コードエラー

私がやりたかったのは、重複なしにTemp_Studentから2列を挿入することでした。現在、これはコードの一部で、別のものが渡されました。私は本当にこれの多くを理解していない。他の方法がある場合は私にも提案してください。ありがとう

+0

「黒の値」とは何ですか? – STLDeveloper

+1

変数_test_は_blank_値に設定されています。値が存在するかどうかをチェックします。値が存在しない場合は、ユーザーとパスワードの両方に_blank_値を挿入し、リーダーの最後までループを繰り返しますが、この時点で_blank_行が追加されています。あなたは本当に価値がありますか?私は読者が指している現在のレコードの価値を推測します。 – Steve

+0

いいね。黒=>空白。編集されました。 – Amy

答えて

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 

外は、すべてのレコードが一致するレコードがStudentであるか否かTemp_Studentに戻る参加します。 Studentに一致するレコードがない場合、そのテーブルから選択された列はヌルです。したがって、この結合に基づいてStudentに一致しないTemp_Studentのレコードのみを返します。

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にそれを適用します。

関連する問題