函数序列错误,SQL state S1010 while execution a Prepared Statement

Posted

技术标签:

【中文标题】函数序列错误,SQL state S1010 while execution a Prepared Statement【英文标题】:Function sequence error, SQL state S1010 while executing a prepared Statement 【发布时间】:2013-03-27 11:17:45 【问题描述】:

我正在将旧的 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 次。 我已经尝试关闭自动提交。 我错过了什么吗?

【问题讨论】:

这个[39x?]是什么意思? 它只是?,?,?,?,?,... 的快捷方式。 39 个问号匹配 39 列。 请使用您使用的实际代码更新您的问题,除非您的源代码与上述语句完全匹配。在问题中使用快捷方式是有问题的。 @ThomasMueller 查询本身运行良好,我删除了不必要的部分以保持帖子较小。但如果它对你有帮助,那就去吧。 @BenediktMokroß Simplifying 实际上非常好,但问题是这是一个非法的声明,而且你遗漏了一些文本并不明显。我不知道问题可能是什么。您能否尝试简化程序,例如只插入重现问题所需的那些列?试图找到问题有时是一种二分搜索。或者,也许您可​​以通过查看数据的差异(哪些数据有效,哪些无效)找到原因。 【参考方案1】:

打开 ODBC 跟踪,这应该可以为您提供有关问题的线索。

您要访问 SQL Server 的事实让我怀疑您正在达到 SQL Server 的一个活动语句限制。也许考虑使用 MARS 或任何其他解决方法(或两个连接)。

【讨论】:

【参考方案2】:

感谢尼克,我走上了解决问题的正确道路。我使用了 MARS 连接。 我正在使用正确的 Connection-DSN 发布我自己的答案,因此遇到相同问题的其他开发人员不需要搜索它。

$_new = odbc_connect('DRIVER=SQL Server Native Client 11.0;'.
                     'SERVER=<ServerIP>;'.
                     'DATABASE=<DatabaseName>;'.
                     'MARS_Connection=yes;',
                     '<user>',
                     '<password>');

【讨论】:

以上是关于函数序列错误,SQL state S1010 while execution a Prepared Statement的主要内容,如果未能解决你的问题,请参考以下文章

什么类型的错误导致 MS SQL Server 中的 XACT_STATE 为 1?

matlab伪随机序列的状态 rand(‘state‘,sum(100*clock))的作用

在 OBIEE 中运行报告时出错 -> [SQL_STATE: HY000] [nQSError: 10058] 发生一般错误

SQL Server 关于kill state

如何使用 SQL 比较序列?

如何修复错误不兼容的数据类型组合 [SQL State=42562, DB Errorcode=-5562]