2014-06-08 2 views
-1

회사 직원의 청구 내역을 유지 관리하는 Windows 양식 애플리케이션이 있습니다. 응용 프로그램은 MS Access 데이터베이스에 데이터를 저장하고 조작합니다. 직원이 웹 사이트에서 월별 보고서를 볼 수 있도록 SQL Server 웹 데이터베이스에 모든 데이터를 보내야합니다. 내 코드는 다음과 같습니다로컬 시스템의 데이터를 Web SQL Server에 액세스 할 수 있습니까?

Private Sub UploadData() 
    Dim conn as New OleDb.OleDbConnection("Connection String Ms Access DB") 
    Dim SCON = New SqlConnection(" Web SQL Sever Connection") 
     Try 
      SCON.Open() 
     Catch ex As Exception 
      MsgBox(ex.Message) 
      Exit Sub 
     End Try 
    Dim Qcmd As New SqlCommand("select query", SCON) 
    Dim Cmd As New OleDbCommand("select id,acc,newacc,city,name,billduedateamt,oldbalance from Records where city = 'Delhi'", conn) 
    Dim Mrdr As OleDbDataReader = Cmd.ExecuteReader 
     Try 
      While Mrdr.Read 
       Qcmd.CommandText = "Insert into billing (acc,newacc,city,name,billduedateamt,oldbalance) Values (" + _ 
         Mrdr.Item(0) + "," + Mrdr.Item(1) + ... Up to So On ")" 
       Qcmd.ExecuteNonQuery() 
      End While 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     Finally 
      If SCON.State <> ConnectionState.Closed Then 
       SCON.Close() 
      End If 
      conn.Close() 
     End Try 

End Sub 

그것은 그렇게 할 더 나은 코드가 너무 느린가 있어요?

+0

예입니다. 슬프게도 행동 주의적 충고는 "내 코드를 수정하면 내가 할 수있는 단서가 없다"는 것보다 조금 더 복잡합니다. 대체 솔루션은 SQL을 사용하지 않고 중앙 사이트에서 웹 서비스 또는 압축 된 데이터 피드를 받아들이는 다른 방법을 사용하는 서버를 사용합니다. 핵심 문제는 대기 시간이 긴 연결에서 "다음 번에 삽입"입니다. – TomTom

+0

데이터 집합을 Web SQL Server로 보내거나 업데이트 할 수 있습니까? –

+0

이 쿼리를 실행하는 동안 한 번에 하나의 SQL 삽입 쿼리를 만들려고합니다. 다음과 같이 삽입하십시오. \t INSERT INTO MyTable (ID, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, '조'); – TotPeRo

답변

2

코드 보여주는 대량 복사의 일부 짧다.

private static void PerformBulkCopyDifferentSchema() 
{ 
    string connectionString = @"Server= 
     localhost;Database=Northwind;Trusted_Connection=true"; 
    DataTable sourceData = new DataTable(); 
    // get the source data 
    using (SqlConnection sourceConnection = 
        new SqlConnection(connectionString)) 
    { 
     SqlCommand myCommand = 
      new SqlCommand("SELECT TOP 5 * 
      FROM Products_Archive", sourceConnection); 
     sourceConnection.Open(); 
     SqlDataReader reader = myCommand.ExecuteReader(); 
     // open the destination data 
     using (SqlConnection destinationConnection = 
        new SqlConnection(connectionString)) 
     { 
      // open the connection 
      destinationConnection.Open(); 
      using (SqlBulkCopy bulkCopy = 
       new SqlBulkCopy(destinationConnection.ConnectionString)) 
      { 
       bulkCopy.ColumnMappings.Add("ProductID", "ProductID"); 
       bulkCopy.ColumnMappings.Add("ProductName", "Name"); 
       bulkCopy.ColumnMappings.Add("QuantityPerUnit", "Quantity"); 
       bulkCopy.DestinationTableName = "Products_TopSelling"; 
       bulkCopy.WriteToServer(reader); 
      } 
     } 
     reader.Close(); 
    } 
} 
0

데이터를 삽입하는 경우 .NET의 SqlBulkCopy 클래스를 통해 표시되는 SQL Server의 대량 복사 기능을 사용하십시오. 데이터 어댑터를 사용하여 DataTable에 Access의 데이터를 채운 다음 SqlBulkCopy을 사용하여 최대한 빨리 SQL Server에 lot을 삽입하십시오. 이 같은

+0

SqlBulkCopy를 사용하는 코드의 예나 링크를 제공해 주시겠습니까? –

+0

아니요. 귀찮은 일이 없도록 코드를 작성하지 않으려 고합니다. 몇 가지 연구를하고 그것에 대해 뭔가를 배운 다음 자신을 위해 노력하십시오. 문제가있는 경우 구체적으로 새 질문을 게시하십시오. – jmcilhinney

0

시도 뭔가 : 여기

Private Sub UploadData() 
Dim conn as New OleDb.OleDbConnection("Connection String Ms Access DB") 
Dim SCON = New SqlConnection(" Web SQL Sever Connection") 
    Try 
     SCON.Open() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     Exit Sub 
    End Try 
Dim Qcmd As New SqlCommand("select query", SCON) 
Dim Cmd As New OleDbCommand("select id,acc,newacc,city,name,billduedateamt,oldbalance from Records where city = 'Delhi'", conn) 

Dim Mrdr As OleDbDataReader = Cmd.ExecuteReader 
    Try 
     Dim sqlInsert as String="Insert into billing (acc,newacc,city,name,billduedateamt,oldbalance) " 
     While Mrdr.Read 
      sqlInsert = sqlInsert + " Values (" + _ 
        Mrdr.Item(0) + "," + Mrdr.Item(1) + ... Up to So On ")" 

     End While 
     Qcmd.CommandText = sqlInsert 
      Qcmd.ExecuteNonQuery() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    Finally 
     If SCON.State <> ConnectionState.Closed Then 
      SCON.Close() 
     End If 
     conn.Close() 
    End Try 

End Sub 
+0

** SQL 문을 함께 쓰지 마십시오! 이것은 광기입니다. ** SQL 인젝션 ** 공격에 대한 문호를 열어 줍니다. 오류가 발생하기 쉽습니다. ** 그렇게하지 마십시오! **. 대신 ** 매개 변수화 된 쿼리 사용 - 항상 예외 없음 ** –

+0

@marc_s : 당신은 맞습니다. 그러나 SQL 인젝션을 수행하는 웹 애플리케이션이 아니며 웹이나 알 수없는 사용자가 아닌 신뢰할 수있는 사용자가 애플리케이션을 사용하는 경우 매개 변수화 할 필요는 없습니다. – TotPeRo

+0

*** 항상 *** 매개 변수화 된 쿼리 사용 - *** NO *** 예외, 필요하지 않은 시나리오 없음 - 문자열 concetenation으로 처리하는 것에 대해 생각조차하지 마십시오! 진지하게. *** 절대 *** 문자열 연결을 사용하여 SQL 문을 작성하십시오. –

관련 문제