2012-11-19 4 views
2

나는 매분마다 SQL Server에서 약 200 개의 레코드를 가져 와서 상태 필드를 1로 업데이트하고 변경하지 않고/0을 200 레코드 실패로 기록한 다음 다시 작성해야하는 상황이 있습니다. DB에. 이 경우에는 데이터 테이블을 변경 한 다음 루프의 끝에서 처리 상태에 따라 업데이트 방법을 호출하는 .net 메서드로 이동해야합니다.DataSet 업데이트와 SQL 쿼리

아니면 내가 더 효율적입니다 어떤 방법이

String sql = "update customer set status = 1 where id in (" 
while records in dataset 
    sql = sql + dataset.getId + "," 
end while 
and the execute sql; 

처럼 루프를 만드는 직접적인 방법을 가야하나요? 실제로 알고 싶은 것은 dataTable에서 하나의 열만 변경하고 업데이트하면 백엔드에서 어떻게 쿼리가 실행됩니까? 그것은 단지 하나의 SQL 또는 각 행에 대한 여러가요. 그 다음에 여러 번 SQL 메소드를 사용하거나 다른 제안 된 메소드가 있어야합니다.

+0

? 이것이 데이터에 대한 변경 사항이고 DB에 변경 사항을 다시 쓰는 경우 트리거를 고려할 수 있습니다. – Raj

+0

@Raj 프로세스가 다른 것입니다. 나는 다른 컬럼을 바꾸지 않을 것이다. 그냥 다른 서버에 연결하여 가져온 세부 정보를 기반으로 무언가를 확인하고 해당 상태 열이 상태 열에서 1로 업데이트해야하는 경우를 가정 해 봅시다. 그렇지 않으면 변경되지 않습니다. –

+0

두 번째 방법은 단일 쿼리로 실행되므로 효율적입니다. 하지만 yourDataAdapter.Update (datatable)는 한 번에 한 행을 실행하므로 200 개의 쿼리가 실행됩니다 (최악의 경우). 하지만 더 나은 해결책을 찾으려는데, DB 수준에서이 작업을 저장 프로 시저에서 수행하는 것과 같습니다. – Kash

답변

0

개체에 수백 개의 속성이 없으면 성능 차이가 매우 작습니다. 이 메서드 들간의 차이점보다 개체와 상호 작용할 DataSet 또는 SQL 쿼리를 사용하도록 코드를 작성하는 데 더 많은 시간을 할애 할 것입니다.

편집

지금까지 "가 백 엔드에서 실행되는 방법", RDBMS에서 그것을 실행하는 것입니다 쿼리에 대한 "실행 계획"을 생성한다. 동일한 쿼리 (중복/쓸모없는 정보 포함)를 100 번 실행하는 것보다 100 가지 쿼리에 대한 실행 계획을 생성하는 데 서버가 더 많은 시간을 필요로합니다.

+0

제 경우에 제안 된 방법은 정확히 무엇입니까. DataTable.update가 백엔드에서 어떻게 구현되는지 알고 싶습니다. 여러 행의 같은 열이 업데이트 될 때 하나의 쿼리 또는 다른 쿼리입니까? –

0

다음 코드는 주어진 필드에 1이 사용 된 레코드 ("testfield")를 삭제합니다. 테스트중인 필드가 날짜 인 경우, 쿼리가 더 복잡해 : 그것은 하나의 쿼리로 실행됩니다으로

 Dim MyValue as Byte 
     Dim TableName, FieldName As String 

     Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\mydata\myfile.mdb" 
     Dim cn As New OleDbConnection(ConnString) 
     cn.Open() 

     Dim qry As String 
     Dim cmd As New OleDbCommand(qry, cn) 
     TableName="salary" 
     FieldName = "testfield" 
     myvalue = 1 
     qry = " DELETE from " & TableName & " WHERE (" & FieldName & " = '" & myvalue & "')" 
     Dim cmd As New OleDbCommand(qry, cn) 
     recordsadded = cmd.ExecuteNonQuery() 
1

귀하의 두번째 방법은 효율적입니다. 하지만 yourDataAdapter.Update (datatable)는 한 번에 하나의 행을 실행하므로 200 개의 쿼리가 실행됩니다 (최악의 경우).

확인이 http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update(v=vs.80).aspx

은 말한다 :

Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataSet from a DataTable named "Table."

참고 : 나는 2 년 전이 dataAdapter.Update을 테스트 한 for each inserted, updated, or deleted row

, 그것은 행에 의해 쿼리 행을 실행합니다.

하지만 DB의 말처럼에서이 업데이트 논리를 가지고하려고 ...

update c set status = 1 from customer as c inner join yourOtherTable as t on c.id = t.id where ....

정확하게 당신이 과정에서 무슨 소리