2016-11-16 2 views
0

마법사 컨트롤을 사용하여 사용자가 여러 단계를 거치도록하고 있습니다. 1 단계에서 시작하지만, 예 또는 아니오 (라디오 버튼)로 대답하는 경우 일부 단계를 건너 뛰는 경우가 있습니다. 예를 들어, 일부 단계의 끝에있는 질문은 "문제가 해결 되었습니까?" 예 또는 아니오 라디오 버튼 선택 사항이 있습니다. 대답이 '예'이면 마지막 단계로 이동하여 끝내십시오. 대답이 '아니오'이면 단계별로 이동합니다.멀티 케이스 스위치 명세서에서 사용자 선택 받기

내 문제는 데이터베이스의 테이블 테스트에 대한 모든 단계의 결과를 얻는 것입니다.

 string constring = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ClientMonitorDevices"].ConnectionString; 
     SqlConnection conn = new SqlConnection(constring); 
     SqlCommand cmd = new SqlCommand(); 

     cmd = conn.CreateCommand(); 
     cmd.CommandText = @"INSERT INTO test (siteid, hotelname, step1, step2) 
          VALUES (@siteid, @hotelname, @step1, @step2)"; 

     cmd.Parameters.AddWithValue("@siteid", siteid); 
     cmd.Parameters.AddWithValue("@hotelname", hotelname); 

     int activeStep = Wizard1.ActiveStepIndex; 

     switch (activeStep) 
     { 
      case 1: 
       if (step1_yes.Checked) 
       { 
        step1 = "Device Can Detect Network with a Signal Strength of 50% or Greater"; 
        Wizard1.ActiveStepIndex = 2; 
       } 
       else if (step1_no.Checked) 
       { 
        step1 = "Device Cannot Detect Network with a Signal Strength of 50% or Greater"; 
        Wizard1.ActiveStepIndex = 16; 
       } 
       else 
       { 
        e.Cancel = true; 
        gen.MessagBox(this.Page, "Please choose Yes or No", "Please choose Yes or No"); 
       } 
       cmd.Parameters.AddWithValue("@step1", step1); 
       break; 
      case 2: 
       if (step2_unable.Checked) 
       { 
        step2 = "Unable to Join Network"; 
        Wizard1.ActiveStepIndex = 3; 
       } 
       else if (step2_unidentified.Checked) 
       { 
        step2 = "Connect to Unidentified Network"; 
        Wizard1.ActiveStepIndex = 7; 
       } 
       else if (step2_internet.Checked) 
       { 
        step2 = "Connected (Internet Access)"; 
        Wizard1.ActiveStepIndex = 11; 
       } 
       else if (step2_local.Checked) 
       { 
        step2 = "Connected Local Only (No Internet Access)"; 
        Wizard1.ActiveStepIndex = 15; 
       } 
       else 
       { 
        e.Cancel = true; 
        gen.MessagBox(this.Page, "Please Choose One of the Options", "Please Choose One of the Options"); 
       } 
       cmd.Parameters.AddWithValue("@step2", step2); 
       conn.Open(); 
       cmd.ExecuteNonQuery(); 
       conn.Close(); 
       break; 

오류는 "@ step1"스칼라 변수를 선언해야합니다. 왜냐하면 step1이 범위를 벗어나거나 내가 생각하기에 그렇기 때문입니다. 저장 프로 시저를 시도했지만 그 중 하나가 작동하지 않았습니다.

또 다른 시도는 update 문을 사용하는 것이지만 문제는 내가 삽입 할 때마다 색인화 할 수있는 ID 열 (색인)을 얻는 것입니다. 누구든지 아이디어가 있다면 꼭 알려주십시오. 나는 약 2 주 동안 아무 일도없이이 일을하고있다.

답변

0

문제는 @step1 매개 변수가 포함 된 쿼리가, 조건부 구조 (즉, switch 블록)의 외부에 정의되어 있습니다 :

cmd.CommandText = @"INSERT INTO test (siteid, hotelname, step1, step2) 
        VALUES (@siteid, @hotelname, @step1, @step2)"; 

그러나, 당신은 단지 @step1 쿼리 PARAM을 공급하고 activeStep 스위치 블록에있는 케이스 중 하나는이고 다른 하나는 @step2입니다. 쿼리 자체에는 두 매개 변수가 모두 필요합니다.

당신은 당신의 가장 바깥 쪽의 경우 문을 모두이 줄을 모두 가질 필요가 :

, 다른 값이 null이 될 것입니다 어느 경우에, 당신은 단지 값을 설정할 수 있습니다 경우
cmd.Parameters.AddWithValue("@step1", step1); 
cmd.Parameters.AddWithValue("@step2", step2); 

DBNull.Value.

+0

잘 모르겠습니다. switch 문을 닫은 팔찌 뒤에 두 문을 switch 문 외부에 넣으려는 건가요? 그렇다면이 작업을 수행하고이 오류가 발생했습니다. 매개 변수화 된 쿼리 '(@siteid nvarchar (6), @ hotelname nvarchar (8), @ step1 nvarchar (4000')는 제공되지 않은 '@ step1'매개 변수를 필요로합니다. 내 모든 변수는 데이터베이스 측에 varchar (max)입니다 – chattyhu

+0

그래서'cmd.Parameters.AddWithValue ("@ step1", step1);'명령문'cmd.Parameters.AddWithValue ("@ 2 단계 ", 2 단계),'이제 아래쪽에'switch' 블록 외부 –

+0

예 '기본 :?. 휴식, } cmd.Parameters.AddWithValue ("@의 1 단계 "1 단계) cmd를. Parameters.AddWithValue ("@ step2", step2); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); ' – chattyhu