2

古いAccess.mdbを新しいMSSQLデータベースに移植していますが、小さな変更が加えられています。私は単純なループを持っています:

//$_new is an MSSQL2011-ODBC-Datasource
//$_old is an old MSACCESS.mdb-ODBC-Datasource
$devices_result = odbc_exec($_old,"SELECT * FROM Druckerarchiv");
$device_insert_prepare = odbc_prepare($_new,"INSERT INTO Geraetearchiv (Kd_Nr,
[Typ],Seriennummer,Firma,Rg_Datum,Dauer,Markerart,Zus_Papierfach,Duplexeinheit,
Universalzufuhr,Plz,Ort,Strasse,Bemerkungen,Telefon,Fax,Ansprechpartner,Abteilung,
Wartung_BEGINN,Wartung_ENDE,Reaktions_TIME,Fix_TIME,Autom_Verl,Vertrags_Nr,
W_EK,W_VK,Wartung_LAUFZEIT,Absprachen,Drucker_USB,Drucker_LAN,Drucker_Parallel,
Drucker_Printserver,Drucker_Printserver_Typ,Drucker_Printserver_Sn,
Drucker_Zusatz,Email,Dienstleister,Garantieverlaengerung,
GVServicedienstleister,Aktiv,Typnummer,Firma_Standort) VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?)");
while($device = odbc_fetch_array($devices_result))
{
    $device_insert = array(
    utf8_encode($device['KD_NR']),
    utf8_encode($device['Druckertyp']),
    utf8_encode($device['Seriennummer']),
    utf8_encode($device['Firma']),
    $device['Rg-Datum'], 
    (float)$device['Dauer'],
    (float)$device['Markerart'],
    (int)$device['2_Papierfach'],
    (int)$device['Duplexeinheit'],
    (int)$device['Universalzufuhr'],
    utf8_encode($device['Plz']),
    utf8_encode($device['Ort']),
    utf8_encode($device['Straße']),
    utf8_encode($device['Bemerkungen']),
    utf8_encode($device['Telefon']),
    utf8_encode($device['Fax']),
    utf8_encode($device['Ansprechpartner']),
    utf8_encode($device['Abteilung']),
    $device['Wartung_BEGINN'],
    $device['Wartung_ENDE'], 
    (int)$device['Reaktions_TIME'],
    (int)$device['Fix_TIME'],
    (int)$device['Autom_Verl'],
    utf8_encode($device['VERTRAGS_NR']),
    (double)$device['W-EK'],
    (double)$device['W-VK'],
    (float)$device['Wartung_LAUFZEIT'],
    utf8_encode($device['Absprachen']),
    0, 
    (int)$device['Ethernet'], 
    0, 
    0, 
    '', 
    '', 
    (($device['Y-Adapter/Typ'])?
    ("Hat Y-Adapter ".$device['Y-Adapter/Typ']." SN: ".$device['Y-Adapter/SN']):null),
    '', 
    (int)$servicedienstleister[$markerart[
    (int)$device['Markerart']]], //dienstleister
    '', 
    '', 
    1, 
    '',
    '',
    );
    odbc_execute($device_insert_prepare,$device_insert);
}

このループは最初の2〜3回実行されます。しかしその後、それはすべての実行に失敗し、スローします

Warning: odbc_execute() [function.odbc-execute]: SQL error: 
[Microsoft][SQL Server Native Client 11.0]Function sequence error, 
SQL state S1010 in SQLDescribeParameter

このループは約30kラウンドを実行する必要があるため、プリペアドステートメントとして実行し、約30k回実行します。私はすでに自動コミットをオフにしようとしました。私は何か見落としてますか?

4

2 に答える 2

1

ODBCトレースをオンにすると、問題に関する手がかりが得られます。

SQL Serverにアクセスしようとしているという事実から、SQLServerのアクティブなステートメントの制限に達しているのではないかと思われます。たぶん、MARSまたは他の回避策(または2つの接続)の使用を検討してください。

于 2013-03-27T16:06:53.650 に答える
1

Nickのおかげで、問題を解決するための正しい道を歩むことができました。MARS-Connectionを使用しました。私は正しいConnection-DSNを使用して自分の回答を投稿しているので、同じ問題を抱えている他の開発者はそれを検索する必要がありません。

$_new = odbc_connect('DRIVER={SQL Server Native Client 11.0};'.
                     'SERVER=<ServerIP>;'.
                     'DATABASE=<DatabaseName>;'.
                     'MARS_Connection=yes;',
                     '<user>',
                     '<password>');
于 2013-03-28T16:02:48.630 に答える