2014-12-17 3 views
0

결과에 행이 계속 발생하면이 루프를 실행하려고합니다. 그래서 기본적으로 내 SQL 문이 ssql = "SELECT TOP 1 * from [OrderHeader] Where ([IsisDownloadDate] is null or [IsisDownloadDate] = '')"루프 SQL에 행이 계속되는 경우

에 행을 반환하는 다음 WebRequest를 제출 실행할 계속 있다면, 그래서 기본적으로 난 그냥 그것을 원하는 열을

을 한 후, 값을 반환 동일한 행에 그 값을 입력하고 업데이트 ssql이 행을 반환하는 한 다음 행을 계속 업데이트하고 모든 행을 반환하지 않으면 중지합니다. 코드

내가 연속 루프 문제 여기

외에, 일을 모든 것을 가지고있다 : 전체 게다가

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 


    Dim objDR As SqlClient.SqlDataReader 
    Dim objCommand As SqlClient.SqlCommand 
    Dim ConnectionString As String = "Data Source=localhost;Initial Catalog=datarep;user id=sa;password=test123;" 
    Dim objConnection As SqlClient.SqlConnection 
    Dim ssql As String 

    objConnection = New SqlClient.SqlConnection(ConnectionString) 
    ssql = "SELECT TOP 1 * from [OrderHeader] Where ([IsisDownloadDate] is null or [IsisDownloadDate] = '')" 

    If objConnection.State <> ConnectionState.Open Then 
     objConnection.Open() 
    End If 
    objCommand = New SqlClient.SqlCommand(ssql, objConnection) 
    objDR = objCommand.ExecuteReader(CommandBehavior.CloseConnection) 
    objCommand = Nothing 

    If objDR.HasRows Then 
     While objDR.Read() 

      Dim objSO As New WebReference.SalesOrder 
      Dim objBTAddr As New WebReference.BillToAddress 
      Dim objSTaddr As New WebReference.ShipToAddress 
      Dim objAddr As New WebReference.Address 
      Dim objPart() As WebReference.SalesOrderPart 
      Dim objMisc As New WebReference.SalesOrderMiscCharges 
      Dim objPayment As New WebReference.Payment 
      Dim objCreditCard As New WebReference.SalesOrderCreditCard 
      Dim objApproval As New WebReference.SalesOrderCreditCardApproval 

      objSO.OrderNumber = "69355522" 
      objSO.CompanyId = "301" 
      objSO.CustomerNumber = "5838303" 
      objSO.Code = "I" 

      objSO.PONumber = objDR("OrderNumber").ToString() 
      objSO.Source = "TAW.COM" 

      objSO.OrderDate = Format(Date.Now, "MM/dd/yy") 
      objSO.RequiredDate = Format(Date.Now, "MM/dd/yy") 

      objSO.ShipCode = "UPG" 
      objSO.EmployeeId = "1" 

      objAddr.Name = "José Peña,EPS H-1607" 
      objAddr.Address1 = "LÄRKGATAN 9" 
      objAddr.City = "Québec" 
      objAddr.Country = "US" 
      objAddr.State = "CA" 
      objAddr.Zip = "90220" 
      objSTaddr.Address = objAddr 

      'objSTaddr.Phone = "310-900-5509" 

      objBTAddr.AccountNumber = "595522" 
      objBTAddr.Address = objAddr 
      objSO.BillToAddress = objBTAddr 

      'turn on for .88 
      'objSO.ShipTo = objSTaddr 
      'objSO.ShipTo.Phone = objSTaddr.Phone 

      ReDim objPart(1) 

      objPart(0) = New WebReference.SalesOrderPart 
      objPart(0).PartNumber = "EVE510-621" 
      objPart(0).PartId = "EVE" 
      objPart(0).Quantity = 1 
      objPart(0).Price = 39.99 
      objPart(0).Description = "PWRAID SPCR" 

      objSO.Parts = objPart 
      Dim ws As New WebReference.WebServiceTyped 
      Dim result As WebReference.SubmitOrder = ws.SubmitSalesOrder(objSO) 

      Dim ordernum As String = result.OrderId 

      Dim s As String = "Data Source=localhost;Initial Catalog=datarep;user id=sa;password=test123;" 
      Dim sql As String 
      Dim con As New SqlConnection 

      con = New SqlConnection(s) 
      con.Open() 

      sql = "WITH UpdateList_view AS (SELECT TOP 1 * from [OrderHeader] Where ([IsisDownloadDate] is null or [IsisDownloadDate] = '')) update UpdateList_view set [IsisDownloadDate] = '" & result.OrderId & "'" 
       Dim cmd As New SqlClient.SqlCommand(sql, con) 
       cmd.ExecuteNonQuery() 

       con.Close() 

     End While 
    End If 
    objDR.Close() 
    objDR = Nothing 

End Sub 
+0

이 쿼리에 대한 행이있을 경우 SELECT TOP 1 * from [OrderHeader] Where ([IsisDownloadDate]가 null이거나 [IsisDownloadDate] = ''항상 반환하지 않겠습니까? TOP 1 및 이미 반환 된 레코드를 제외하십시오. 이전에받은 레코드를 제외하면 루프가 종료되는 유일한 방법은 기술적으로는 아닙니다. – Jt2ouan

답변

0

, 당신이 이런 식으로 문제를 싶지 왜 문제가 있다는 것입니다 한 행만 선택하고 있습니다. 당신의 while 회 돌이는 그 단일 행을지나 다음으로 빠져 나갑니다. 이 코드에는 많은 문제가 있지만이 방법으로하지 않는 것이 좋습니다.

코드를 조금 살펴 보겠습니다. 이 기준, 행 J 및 행 6에 맞는 두 개의 행이 있다고 가정 해 보겠습니다. 상위 1을 선택하면 행 J가 다시 나타납니다. If objDR.HasRows은 true로 평가되고 while 조건으로 이동합니다. 읽고 업데이트 한 후에는 while 조건으로 돌아갑니다. 이미 행 J를 읽고 vb.net 코드는 데이터베이스에있는 다른 항목을 인식하지 못하기 때문에 while 루프를 종료하고 하위를 종료합니다.

기준에 맞는 모든 행을 방망이에서 바로 선택하는 것이 좋습니다. 상위 1 개가 아닌 모든 데이터를 선택하는 것은 나가서 데이터베이스에 연결하는 데 많은 비용이 들기 때문에 데이터베이스에서 한 번에 하나의 행을 선택하는 것보다 낫습니다. 당신의 방법, 당신은 기준에 맞는 각 행에 대해 데이터베이스에 두 번 연결할 것입니다. 내 방식대로, 각 행에 한 번 더하기와 처음에 한 번 더 연결합니다. 행을 많이 업데이트하는 경우 큰 차이가 있습니다. 귀하의 SQL은 더 비슷해 보일 것입니다

SELECT UniqueId from [OrderHeader] Where ([IsisDownloadDate] is null or [IsisDownloadDate] = '') 

이제 루프를 실행하면 모든 데이터가 처리됩니다. 또한 데이터를 업데이트 할 때보고있는 특정 행을 업데이트하는 매개 변수를 사용해야합니다. 일종의 고유 ID가 일반적으로 가장 좋습니다. 실제로, 당신은 이것을 위해 cte를 필요로하지 않습니다. 같은 뭔가 :

sql = New SqlCommand("UPDATE UpdateList_view SET [IsisDownloadDate] = @OrderId WHERE UniqueId = @ID", dbConn) 
sql.Parameters.AddWithValue("@OrderId", result.OrderId) 
sql.Parameters.AddWithValue("@Id", objDR.GetInt32(0)) 

주, objDR.GetInt32(0) 첫 번째 SQL 쿼리에서 선택 될 것 고유 ID로 @Id 매개 변수를 설정 될 것이다. 또한 sqlCommand에 매개 변수를 추가 한 방법을 살펴보십시오. update UpdateList_view set [IsisDownloadDate] = '" & result.OrderId & "'"은 SQL injection을 열어두기 때문에 이런 식으로 코딩하는 습관을 갖춰야합니다.

마지막으로 각 행을 한 번에 하나씩 업데이트하는 대신 SQL 대량 업데이트를 수행하는 것이 좋습니다. This은 아마도 시작하기에 좋은 장소 일 것입니다.

관련 문제