2015-01-27 2 views
-1

문제가있어서 도움을 주시면 감사하겠습니다. 이 코드를 실행할 때 같은 단추에서 다른 쿼리의 결과를 사용해야합니다. 먼저 닫아야하는이 명령과 연결된 열린 DataReader가 이미 있습니다.다른 쿼리의 쿼리 결과 사용

protected void Button1_Click(object sender, EventArgs e) 
{    
    con.Open(); 
    SqlCommand cmd = con.CreateCommand(); 
    cmd.CommandType = CommandType.Text; 

    //use a sqlparameter to avoid the possibility of sql injection 
    SqlParameter p = new SqlParameter("p1", ddlClients.SelectedValue); 
    SqlParameter q = new SqlParameter("q1", ddlProjets.SelectedValue); 
    SqlParameter t = new SqlParameter("t1", ddlProduits.SelectedValue); 
    SqlParameter r = new SqlParameter("r1", ddlShift.SelectedValue); 
    SqlParameter s = new SqlParameter("s1", ddlDefaut.SelectedValue); 


    cmd.Parameters.Add(p); 
    cmd.Parameters.Add(q); 
    cmd.Parameters.Add(r); 
    cmd.Parameters.Add(s); 
    cmd.Parameters.Add(t); 


    cmd.CommandText = "insert into Aff (Operations_ID, Emplacements_ID, Projets_ID, Zones_ID, Machines_ID)values(15, 25, @p1, 1, 5)"; 

    cmd.CommandText = "SELECT IDENT_CURRENT('Aff')"; 
    SqlDataReader reader = cmd.ExecuteReader(); 
    if (reader.Read()) 
    { 
     cmd.CommandText = "insert into Insp (Affectations_ID, Shifts_ID, Produits_ID, date, Machine) values(reader ,@r1, @t1, '" + TextBox1.Text + "', '" + TextBox2.Text + "')"; // here is the problem 
    } 

    cmd.CommandText = "SELECT IDENT_CURRENT('Insp')"; 
    SqlDataReader reader2 = cmd.ExecuteReader(); 
    if (reader2.Read()) 
    { 
     cmd.CommandText = "insert into def (BaseDefauts_ID, Inspection_ID, matricule, quantite) values(@s1, reader2, '" + TextBox3.Text + "', '" + TextBox4.Text + "')"; 
    } 

    cmd.ExecuteNonQuery(); 
    con.Close(); 
    Response.Redirect("Cascad.aspx"); 
} 
+0

캔트 당신은 그냥 첫 번째 결과의 새로운 "쿼리"에 가입 할 수있는 그런 식으로 참여할 수 있습니까? – Shocklo

+0

IMO 하나의 쿼리에서 (그리고 SQL 연결 대신 매개 변수를 사용하여) 모든 작업을 수행 할 수 있습니다. ... 어쨌든 ... SqlDataReader는 매번 사용 후 (연결시에도 동일하게) 폐기되어야합니다 (MUST). –

+0

CommandText를 다시 설정할 경우 알림이 작동하지 않습니다. 첫 번째 SQL은 후자로 대체됩니다. 첫 번째 명령을 실행하거나 단일 명령 텍스트로 결합해야합니다. –

답변

0

이미 먼저 닫아야이 명령과 관련된 열린 DataReader가 있습니다.

당신은 데이터 판독기가 배치되도록 할 것 using 블록에서 나오는 데이터 리더, 예컨대 :

using(var reader = cmd.ExecuteReader()) 
{ 
    if (reader.Read()) 
    { 
     ... 
    } 
} 

을 처분해야하고, 다시 ExecuteReader 할 수 있습니다.

+0

I 사용 동작 (SqlDataReader의 리더 = cmd.ExecuteReader()) { (reader.Read()) { cmd.CommandText = "가 INSP에 삽입하면 (Affectations_ID, TextBox1.Text + " ', + TextBox2.Text +"') "; } } 'reader2'열 이름이 잘못되었습니다. – Lamyae

+0

@Lamyae 분명히 이전 오류를 넘어서서 디버깅해야 할 또 다른 문제가 있습니다. –

0

코드에서 reader.Close();보다 앞에 cmd.CommandText = "SELECT IDENT_CURRENT('Insp')";을 입력하십시오.

+0

PLZ 내가 실행할 때 다른 문제가있다. 변수 "reader"를 인식하지 못한다. 스칼라 변수 "@reader"를 선언해야한다. – Lamyae

관련 문제