`cursor.bulkcopy()` fails,RuntimeError: Failed to connect to SQL Server: Protocol Error: Failed to receive token during login response parsing
Maintainer antworten meist innerhalb von 2 Tagen
@bewithgaurav arbeitet bereits daran.
Seit 01.6.2026.
Bewertung
Dieses Issue wurde noch nicht bewertet.
Beschreibung
-- coding:utf-8 --
"""
Test script for cursor.bulkcopy() failure
This script isolates the bulkcopy() issue without GUI interference.
Result: bulkcopy() ALWAYS fails with:
"RuntimeError: Failed to connect to SQL Server: Protocol Error: Failed to receive token during login response parsing"
while the normal ODBC connection via mssql-python.connect() works perfectly fine.
Environment:
- Python: 3.11.x
- MSSQL-Python: 1.7.1 (latest pip version, includes PR #439 which passes all connection string params to py-core)
- MSSQL-Py-Core: bundled with mssql-python (Rust .pyd binary, cannot be upgraded separately from pip)
- ODBC Driver: ODBC Driver 18 for SQL Server (auto-managed by mssql-python, no manual DSN setup needed)
- SQL Server: Microsoft SQL Server 2016 (13.x)
- Target table: temp_TEST_BATCHCOPY (56 columns, varchar/nvarchar only)
- Auth: SQL Login (UID/PWD), with TrustServerCertificate=yes
- OS: Windows 11
"""
import sys
import platform
import mssql_python
============================================================
0. Environment info
============================================================
print("=" * 60)
print("Environment")
print("=" * 60)
print(f"Python version: {sys.version}")
print(f"Platform: {platform.platform()}")
print(f"mssql-python version: {mssql_python.version}")
--- CONFIGURE THESE FOR YOUR ENVIRONMENT ---
CONN_STR = 'SERVER=192.168.0.18;DATABASE=AAB;UID=fa_app;PWD=qazwsx!@;TrustServerCertificate=yes;'
TABLE = 'temp_TEST_BATCHCOPY'
--------------------------------------------
try:
conn = mssql_python.connect(CONN_STR)
c = conn.cursor()
c.execute("SELECT @@VERSION")
sql_ver = c.fetchone()[0]
print(f"SQL Server: {sql_ver.split(chr(10))[0].strip()}")
conn.close()
except Exception as e:
print(f"Cannot get SQL Server version (will continue): {e}")
============================================================
1. Normal connection + metadata query (always works)
============================================================
print()
print("=" * 60)
print("1. Normal connection + metadata query")
print("=" * 60)
conn = mssql_python.connect(CONN_STR)
c = conn.cursor()
c.execute("IF OBJECT_ID(N'temp_TEST_BATCHCOPY', N'U') IS NULL SELECT 0 ELSE SELECT 1")
exists = c.fetchone()[0]
print(f"Table exists: {exists}")
c.execute("""SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ? ORDER BY ORDINAL_POSITION""", (TABLE,))
table_columns = [r[0] for r in c.fetchall()]
print(f"Number of columns: {len(table_columns)}")
print(f"Column names (first 5): {table_columns[:5]}...")
conn.close()
============================================================
2. Test cursor.bulkcopy()
============================================================
print()
print("=" * 60)
print("2. Test cursor.bulkcopy()")
print("=" * 60)
Build 5 rows of test data matching the table column count
test_data = [tuple(f"test_row{i}_col{j}" for j in range(len(table_columns))) for i in range(5)]
print(f"Test data rows: {len(test_data)}")
print(f"Values per row: {len(test_data[0])}")
fresh_conn = mssql_python.connect(CONN_STR)
fresh_c = fresh_conn.cursor()
try:
result = fresh_c.bulkcopy(
TABLE,
test_data,
batch_size=0,
timeout=30,
column_mappings=table_columns,
)
print(f"bulkcopy() SUCCEEDED: {result}")
except Exception as e:
print(f"bulkcopy() FAILED!")
print(f" Exception type: {type(e).name}")
print(f" Error message: {str(e)}")
finally:
fresh_conn.close()
============================================================
3. Verify if any data was actually inserted
============================================================
print()
print("=" * 60)
print("3. Verify row count after test")
print("=" * 60)
try:
vc = mssql_python.connect(CONN_STR)
cr = vc.cursor()
cr.execute(f"SELECT COUNT(*) FROM [{TABLE}]")
print(f"Table '{TABLE}' row count: {cr.fetchone()[0]}")
vc.close()
except Exception as e:
print(f"Verification failed (may be fine): {e}")
============================================================
4. Connection string variant matrix
============================================================
print()
print("=" * 60)
print("4. Connection string variant matrix")
print("=" * 60)
BASE = 'SERVER=192.168.0.18;DATABASE=AAB;UID=fa_app;PWD=qazwsx!@'
data2 = [tuple(f"v{i}_c{j}" for j in range(len(table_columns))) for i in range(2)]
variants = [
(f'{BASE};TrustServerCertificate=yes;', 'TrustServerCertificate=yes'),
(f'{BASE};Encrypt=yes;TrustServerCertificate=yes;','Encrypt=yes;TrustSC=yes'),
(f'{BASE};Encrypt=no;TrustServerCertificate=yes;', 'Encrypt=no;TrustSC=yes'),
(f'{BASE};Encrypt=no;', 'Encrypt=no (no Trust)'),
(f'{BASE};encrypt=no;TrustServerCertificate=yes;', 'lowercase encrypt=no'),
]
for cs, label in variants:
odbc_ok = False
try:
t = mssql_python.connect(cs)
t.close()
odbc_ok = True
except Exception:
pass
try:
b = mssql_python.connect(cs)
bc = b.cursor()
bc.bulkcopy(TABLE, data2, batch_size=0, timeout=30, column_mappings=table_columns)
b.close()
print(f"[{label:35s}] ODBC={'OK ' if odbc_ok else 'ERR'} | BULKCOPY=OK")
except Exception as e:
err = str(e).replace('\n', ' ')[:80]
print(f"[{label:35s}] ODBC={'OK ' if odbc_ok else 'ERR'} | BULKCOPY=FAIL: {err}")
- Vorherrschende Sprache
- Python
- Sterne
- 478
- Forks
- 62
- Ø Merge
- 3 T. 19 Min.
- Gemergte PRs (30 T.)
- 28
Entwicklungsumgebung
Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus microsoft/mssql-python
-
area: bulk-copy triage needed
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
microsoft/mssql-python#843 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
triage needed
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
microsoft/mssql-python#846 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 2 Tagen
-
macOS: encrypted connections fail after Homebrew moved the `openssl` alias to `openssl@4`Evtl. vergeben @bewithgaurav hat das vor 16 Tagen übernommen. Offenarea: packaging-platform bug triage needed
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
microsoft/mssql-python#826 · 2 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Announcement: mssql-python is coming to Django through mssql-django 2.0Evtl. wieder frei @bewithgaurav hat das vor 43 Tagen übernommen, und es ist kein Pull Request offen. Offenannouncement
microsoft/mssql-python#748 · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Connection pool can briefly exceed max_size when pooling is disabled under loadEvtl. vergeben @bewithgaurav hat das vor 25 Tagen übernommen. Offenarea: connectivity-auth bug triage done under development
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 62/100
microsoft/mssql-python#746 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in microsoft/mssql-python
Ähnliche Issues
-
area:core-platform effort:S priority:P3 status:in-review type:test
Schwierigkeit 2/5 Unter einer Stunde Anfängerfreundlichkeit 80/100
randomparity/kdive#3246 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Requantification library converts m/z to mass with the hydrogen-atom mass instead of the proton massOffenbug
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
nf-core/metaboigniter#130 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
common-workflow-language/cwl-utils#477 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Add dependabotOffenfeat
Schwierigkeit 2/5 Unter einer Stunde Anfängerfreundlichkeit 72/100
open-nudge/opentemplate#204 ·
Maintainer antworten meist innerhalb von 1 Tag
-
github-stale-ci-pr-closer: KV state is double-wrapped, never persists, and hits the depth-32 limitEvtl. vergeben @VascoSch92 hat das heute übernommen. Offenpriority:medium ready-for-dev
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
OpenHands/extensions#781 ·
Maintainer antworten meist innerhalb von 1 Tag