2010-06-18 3 views
3

좋아, 그래서 MySQL 쿼리에서 결과와 MS 액세스 데이터베이스 테이블을 채울 필요가. 그것은 전혀 어렵지 않습니다. 템플리트 .mdb 파일을 임시 이름에 복사하고 ODBC를 통해 열리는 프로그램을 작성했습니다. 지금까지 문제 없습니다.배치 삽입 및 준비된 쿼리 오류

Access에서 배치 삽입 (VALUES (foo, bar), (second, query), (third query))을 지원하지 않는 것으로 나타났습니다. 즉 행당 하나의 쿼리 (수십만 개의 행이있을 수 있음)를 실행해야한다는 의미입니다. 초기 성능 테스트는 Access에 약 900 인서트/초의 속도를 나타냅니다. 가장 큰 데이터 세트를 사용하면 실행 시간이 몇 분이 소요될 수 있습니다 (이는 세계의 끝이 아니지만 빠를수록 빠릅니다).

그래서 준비된 문장을 테스트 해 보았습니다. 하지만 계속 오류가 발생합니다 (Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][ODBC Microsoft Access Driver]COUNT field incorrect , SQL state 07001 in SQLExecute in D:\....php on line 30).

여기 (라인 30 odbc_execute이다) 내가 사용하고 코드입니다 :

$sql = 'INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
    VALUES (?, ?, ?, ?, ?, ?)'; 
$stmt = odbc_prepare($conn, $sql); 
for ($i = 200001; $i < 300001; $i++) { 
    $a = array($i, "Field1 $", "Field2 $i", "Field3 $i", "Field4 $i", $i); 
    odbc_execute($stmt, $a); 
} 

그래서 제 질문은 두 배입니다. 첫째, 왜 내가 그 오류 (나는 확인했습니다 및 배열의 ​​번호가 매개 변수의 번호와 일치하는 필드 목록과 일치하는지 어떤 생각입니까 ? 마커)? 그리고 두 번째로, 나는 이것에 대해 귀찮게해야 하는가 아니면 그냥 똑바로 INSERT 문장을 사용해야 할까? 내가 말했듯이, 시간은 중요하지 않지만, 가능하다면, 가능한 한 낮게하고 싶습니다. (그리고 다시 한번, 디스크 처리량에 의해 제한 될 수 있습니다. 900 조작/초가 이미 높습니다.) .

감사

답변

1

행별로이 작업을 수행해야합니까? 한 번에 모든 데이터를 삽입하는 것은 어떻습니까?

What is the best way to synchronize data between MS Access and MySQL?

+0

와아! 너 할 수있어? 자, 내 MySQL 쿼리는 꽤 복잡합니다. Access 구문에서 그 코드를 작성해야합니까? 아니면 MySQL 구문으로 작성하지만 Access를 통해 실행합니까? 가장 명확하게 행 단위로 처리하고 싶지는 않지만 (결과를 생성해야하는 경우) 결과를 생성하는 쿼리는 2와 8 조인 사이에 있고 where 절 (및 group by 절) 속임수 ... 여전히 흥미로운 경로처럼 보입니다 ... – ircmaxell

+0

Access에서 통과 쿼리를 실행하거나 ADO와 MySQL 연결 문자열을 사용할 수 있어야합니다.이 경우에는 IN . 어디에서 시작하고 싶은지 잘 모르겠습니다. 자세한 내용을 설명하기가 다소 어렵습니다. – Fionnuala

+0

월요일에 이걸 가지고 놀아 보겠습니다. 문제가 생기면 새로운 질문을 올리십시오. 고마워요! – ircmaxell

1

합니까 PHP는 당신에게 당신이 매개 변수를 교체 한 후 실행하고있는 INSERT 문을 볼 수있는 방법을 제공? VALUES 목록의 텍스트 값을 따옴표로 묶지 않을 수도 있습니다. 따옴표가 없으면 Jet 데이터베이스 엔진은 'Field1 200001'을 하나가 아닌 두 값으로 해석합니다.

또한 PHP를 모르지만 배열의 두 번째 멤버가 "Field1 $"대신 "Field1 $ i"가되어야합니까?

PHP에서이 문장을 실행할 수 있습니까? 그리고 그것은 효과가 있습니까?

INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
VALUES (
    200001, 
    'Field1 200001', 
    'Field2 200001', 
    'Field3 200001', 
    'Field4 200001', 
    200001); 

어때요?

$sql = 'INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
    VALUES (?, "?", "?", "?", "?", ?)'; 
+0

나는 발견하지 않았습니다. 이후 로컬 파일에 쓰고있어, 나는 심지어 그것을 wireshark 수 없다 (내가 아는) ... – ircmaxell

+0

그래, 그 꽤 괜찮은 작품 ... – ircmaxell

+0

그 경우에, 나는 문제가 의심되는 INSERT 문을 제트없이 제출됩니다 인용 된 텍스트 값. 불행히도 PHP에서 해결할 방법을 찾지 못했습니다. – HansUp