diff --git a/source/pdo_sqlsrv/pdo_dbh.cpp b/source/pdo_sqlsrv/pdo_dbh.cpp index 669bc62b..0f87c7c2 100644 --- a/source/pdo_sqlsrv/pdo_dbh.cpp +++ b/source/pdo_sqlsrv/pdo_dbh.cpp @@ -48,6 +48,7 @@ const char AttachDBFileName[] = "AttachDbFileName"; const char Authentication[] = "Authentication"; const char ColumnEncryption[] = "ColumnEncryption"; const char ConnectionPooling[] = "ConnectionPooling"; +const char Language[] = "Language"; const char ConnectRetryCount[] = "ConnectRetryCount"; const char ConnectRetryInterval[] = "ConnectRetryInterval"; const char Database[] = "Database"; @@ -241,6 +242,15 @@ const connection_option PDO_CONN_OPTS[] = { CONN_ATTR_BOOL, conn_null_func::func }, + { + PDOConnOptionNames::Language, + sizeof( PDOConnOptionNames::Language ), + SQLSRV_CONN_OPTION_LANGUAGE, + ODBCConnOptions::Language, + sizeof( ODBCConnOptions::Language ), + CONN_ATTR_STRING, + conn_str_append_func::func + }, { PDOConnOptionNames::Driver, sizeof(PDOConnOptionNames::Driver), diff --git a/source/shared/core_sqlsrv.h b/source/shared/core_sqlsrv.h index 886d5e82..d4ffdda5 100644 --- a/source/shared/core_sqlsrv.h +++ b/source/shared/core_sqlsrv.h @@ -1131,6 +1131,7 @@ const char Authentication[] = "Authentication"; const char Driver[] = "Driver"; const char CharacterSet[] = "CharacterSet"; const char ConnectionPooling[] = "ConnectionPooling"; +const char Language[] = "Language"; const char ColumnEncryption[] = "ColumnEncryption"; const char ConnectRetryCount[] = "ConnectRetryCount"; const char ConnectRetryInterval[] = "ConnectRetryInterval"; @@ -1163,6 +1164,7 @@ enum SQLSRV_CONN_OPTIONS { SQLSRV_CONN_OPTION_ACCESS_TOKEN, SQLSRV_CONN_OPTION_CHARACTERSET, SQLSRV_CONN_OPTION_CONN_POOLING, + SQLSRV_CONN_OPTION_LANGUAGE, SQLSRV_CONN_OPTION_DATABASE, SQLSRV_CONN_OPTION_ENCRYPT, SQLSRV_CONN_OPTION_FAILOVER_PARTNER, diff --git a/source/sqlsrv/conn.cpp b/source/sqlsrv/conn.cpp index 532934f7..f4827863 100644 --- a/source/sqlsrv/conn.cpp +++ b/source/sqlsrv/conn.cpp @@ -233,6 +233,7 @@ const char Authentication[] = "Authentication"; const char CharacterSet[] = "CharacterSet"; const char ColumnEncryption[] = "ColumnEncryption"; const char ConnectionPooling[] = "ConnectionPooling"; +const char Language[] = "Language"; const char ConnectRetryCount[] = "ConnectRetryCount"; const char ConnectRetryInterval[] = "ConnectRetryInterval"; const char Database[] = "Database"; @@ -380,6 +381,15 @@ const connection_option SS_CONN_OPTS[] = { CONN_ATTR_BOOL, conn_null_func::func }, + { + SSConnOptionNames::Language, + sizeof(SSConnOptionNames::Language), + SQLSRV_CONN_OPTION_LANGUAGE, + ODBCConnOptions::Language, + sizeof(ODBCConnOptions::Language), + CONN_ATTR_STRING, + conn_str_append_func::func + }, { SSConnOptionNames::Driver, sizeof(SSConnOptionNames::Driver), diff --git a/test/functional/sqlsrv/test_error_encoding_with_language_option.phpt b/test/functional/sqlsrv/test_error_encoding_with_language_option.phpt new file mode 100644 index 00000000..0d5d4891 --- /dev/null +++ b/test/functional/sqlsrv/test_error_encoding_with_language_option.phpt @@ -0,0 +1,41 @@ +--TEST-- +Encoding of sqlsrv errors +--SKIPIF-- + +--FILE-- +'UTF-8','Language'=>'German' )); +if (!$conn) { + die(print_r(sqlsrv_errors(), true)); +} + +$stmt = sqlsrv_query($conn, "select *, BadColumn from sys.syslanguages"); +if ($stmt) { + echo 'OK!'; + sqlsrv_free_stmt($stmt); +} else { + $errs = sqlsrv_errors(); + print_r($errs); +} + +sqlsrv_close($conn); + +?> +--EXPECTF-- +Array +( + [0] => Array + ( + [0] => 42S22 + [SQLSTATE] => 42S22 + [1] => 207 + [code] => 207 + [2] => %SUngültiger Spaltenname %cBadColumn%c. + [message] => %SUngültiger Spaltenname %cBadColumn%c. + ) + +)