如何在 DataTypeCompatility 打开时将 12/30/1899 参数化为 SQL 服务器本机客户端?
How to parameterize 12/30/1899 to SQL Server native client when DataTypeCompatility is on?
精简版
尝试将 datetime
值 12/30/1899 传递给 SQL 服务器,失败并显示 日期格式无效 - 但仅适用于本机客户端驱动程序,并且仅适用于 DataTypeCompatiblity 模式。
长版
尝试在 ADO 中使用参数化查询时,针对 SQL 服务器:
SELECT ?
我将 datetime
值参数化为 adDBTimeStamp
:
//Language agnostic, vaguely C#-like pseudo-code
void TestIt()
{
DateTime dt = new DateTime("3/15/2020");
VARIANT v = DateTimeToVariant(dt);
Command cmd = new Command();
cmd.CommandText = "SELECT ? AS SomeDate";
cmd.Parameters.Append(cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
Connection cn = GetConnection();
cmd.Set_ActiveConnection(cn);
cmd.Execute(out recordsAffected, EmptyParam, adExecuteNoRecords);
}
当日期为 3/15/2020
时效果很好。
您创建一个 VARIANT
, with a VType
of 7 (VT_DATE
) 和一个 8 字节浮点值的值:
VARIANT
Int32 vt = 7; //VT_DATE
Double date = 0;
但是它在 12/30/1899 失败了
如果我用一个特定的日期时间执行相同的测试代码,它会失败:
void TestIt()
{
DateTime dt = new DateTime("12/30/1899");
VARIANT v = DateTimeToVariant(dt);
Command cmd = new Command();
cmd.CommandText = "SELECT ? AS SomeDate";
cmd.Parameters.Append(cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
Connection cn = GetConnection();
cmd.Set_ActiveConnection(cn);
cmd.Execute(out recordsAffected, EmptyParam, adExecuteNoRecords);
}
ADO OLEDB 提供程序抛出异常(即在它到达 SQL 服务器之前):
Invalid date format
但并非所有 SQL 服务器 OLEDB 供应商都如此
调试此问题时,我意识到所有 SQL 服务器 OLEDB 提供程序都不会发生此问题。 Microsoft 通常为 SQL 服务器提供 4 个 OLE DB 提供程序:
SQLOLEDB
:用于 SQL 服务器的 Microsoft OLE DB 提供程序(自 Windows 2000 起随 Windows 提供)
SQLNCLI
:SQL 服务器本机客户端(随 SQL Server 2005 一起提供)
SQLNCLI10
:SQL 服务器本机客户端 11.0(随 SQL 服务器 2008 一起提供)
SQLNCLI11
:SQL 服务器本机客户端 12.0(随 SQL 服务器 2012 一起提供)
MSOLEDBSQL
:用于 SQL 服务器的 Microsoft OLE DB 驱动程序(随 SQL Server 2016 一起提供)
当与一些不同的供应商一起尝试时,确实对某些供应商工作正常:
SQLOLEDB
:有效
SQLNCLI11
(没有 DataTypeCompatibility):有效
SQLNCLI11
(启用 DataTypeCompatiility):失败
DataTypeCompatibility?
是的。 ActiveX 数据对象 (ADO),一个围绕不友好的 COM OLEDB API 的友好 COM 包装器,不理解新的 date
、time
、xml
、datetime2
, datetimeoffset
数据类型。创建了新的 OLEDB 数据类型常量来表示这些新类型。因此任何现有的 OLEDB 应用程序都无法理解新常量。
为此,一个新的 keyword is supported by the "native" OLE DB drivers:
DataTypeCompatibility=80
您可以将其添加到您的连接字符串中:
"Provider=SQLNCLI11; Data Source=screwdriver; User ID=hatguy; Password=hunter2;DataTypeCompatibility=80;"
这指示 OLEDB 驱动程序仅 return OLEDB 首次发明时存在的 OLEDB 数据类型:
SQL 服务器数据类型
SQLOLEDB
SQLNCLI
SQLNCLI
(w/DataTypeCompatibility=80)
Xml
adLongVarWChar
141 (DBTYPE_XML)
adLongVarChar
日期时间
adDBTimeStamp
adDBTimeStamp
adDBTimeStamp
日期时间2
adVarWChar
adDBTimeStamp
adVarWChar
日期时间偏移量
adVarWChar
146 (DBTYPE_DBTIMESTAMPOFFSET)
adVarWChar
日期
adVarWChar
adDBDate
adVarWChar
时间
adVarWChar
145 (DBTYPE_DBTIME2)
adVarWChar
UDT
132 (DBTYPE_UDT)
adVarBinary(已记录,未测试)
varchar(最大)
adLongVarChar
adLongVarChar
adLongVarChar
nvarchar(最大)
adLongVarWChar
adLongVarWChar
adLongVarWChar
varbinary(最大)
adLongVarBinary
adLongVarBinary
adLongVarBinary
时间戳
adBinary
adBinary
adBinary
失败了
时间:
- 试图参数化一个
datetime
值
- 值为
12/30/1899
- 使用 “本机客户端” 驱动程序时
- 并且
DataTypeCompatilibty
开启
- 驱动程序本身对这个值感到窒息
- 当它的值是,实际上完全没问题。
尝试使用日期“12/30/1899”本质上没有错:
SELECT CAST('18991230' AS datetime)
工作正常
- 它在原始 OLE DB 驱动程序中工作正常
- 它在 "native" OLE DB 驱动程序
中工作正常
- 它只是在
DataTypeCompatibility
on 的本机驱动程序中失败
显然这是 Microsoft OLE DB 驱动程序中的错误。但这是绝对的事实,微软永远不会,永远,永远,永远 ,修复错误。
那么如何解决呢?
我可以检测到这个特殊的日期时间,我可以尝试解决我们数据访问层中的这个错误。
- 但我需要一个可以放入
VARIANT
结构中的值,
- 表示
12/30/1899 12:00:00 AM
- 在
SQOLEDB
下有效
- 及以下
SQLNCLI
xx 个驱动程序
- 及
MSOLEDBSQL
驱动
- 在
DataTypeCompatibilityMode
- (这到底是怎么回事,即使模式关闭了——尽管在没有模式的情况下使用 ADO 是无效的)
T-SQL由驱动生成
当 OLE DB 驱动程序 确实 懒得按照我说的去做时,我们可以分析生成的 RPC:
SQOLEDB
exec sp_executesql N'SELECT @P1 AS SomeDate',N'@P1 datetime','1899-12-30 00:00:00'
SQLNCLI11
exec sp_executesql N'SELECT @P1 AS SomeDate',N'@P1 datetime2(0)','1899-12-30 00:00:00'
CMRE (Delphi)
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ComObj,
ActiveX,
ADOdb,
ADOint,
Variants;
function GetConnection(Provider: string; DataTypeCompatibility: Boolean): _Connection;
var
connectionString: string;
begin
{
SQLOLEDB - Default provider with Windows
SQLNCLI11 - SQL Server 2008 native client
}
connectionString := 'Provider='+Provider+'; Data Source=screwdriver;User ID=hydrogen;Password=hunter2;';
if DataTypeCompatibility then
connectionString := connectionString+'DataTypeCompatibility=80';
Result := CoConnection.Create;
Result.Open(connectionString, '', '', adConnectUnspecified);
end;
procedure Test(ProviderName: string; DataTypeCompatibility: Boolean);
var
dt: TDateTime;
v: OleVariant;
cmd: _Command;
cn: _Connection;
recordsAffected: OleVariant;
s: string;
begin
dt := EncodeDate(1899, 12, 30);// 12/30/1899 12:00:00 AM (also known in Delphi as zero)
v := dt; //the variant is of type VT_DATE (7)
cmd := CoCommand.Create;
cmd.CommandText := 'SELECT ? AS SomeDate';
cmd.Parameters.Append(cmd.CreateParameter('', adDBTimeStamp, adParamInput, 0, v));
try
cn := GetConnection(ProviderName, DataTypeCompatibility);
except
on E: Exception do
begin
WriteLn('Provider '+ProviderName+' not installed: '+E.message);
Exit;
end;
end;
if SameText(ProviderName, 'SQLOLEDB') then
s := ''
else if DataTypeCompatibility then
s := ' (with DataTypeCompatibility)'
else
s := ' (without DataTypeCompatibility)';
cmd.Set_ActiveConnection(cn);
try
cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);
WriteLn('Provider '+ProviderName+s+': success.');
except
on E:Exception do
begin
WriteLn('Provider '+ProviderName+s+' failed: '+E.Message);
end;
end;
end;
procedure Main;
begin
CoInitialize(nil);
Test('SQLOLEDB', False); //SQL Server client that ships with Windows since 2000
Test('SQLNCLI', False); //SQL Server 2005 native client
Test('SQLNCLI', True); //SQL Server 2005 native client, w/ DataTypeCompatibilty
Test('SQLNCLI10', False); //SQL Server 2008 native client
Test('SQLNCLI10', True); //SQL Server 2008 native client, w/ DataTypeCompatibilty
Test('SQLNCLI11', False); //SQL Server 2012 native client
Test('SQLNCLI11', True); //SQL Server 2012 native client, w/ DataTypeCompatibilty
Test('MSOLEDBSQL', False); //SQL Server 2016 native client
Test('MSOLEDBSQL', True); //SQL Server 2016 native client, w/ DataTypeCompatibilty
end;
begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
WriteLn('Press enter to close');
ReadLn;
end.
虽然这不是 Delphi 特定的问题;我正在使用 Delphi。所以它被标记为 Delphi。如果你抱怨I'm going to choke your tongue out.
Note: This is not ADO.net, it is ADO. It is not managed .NET Framework Class Library, it is the native Win32 COM OLE DB API.
BrakNicku 找到了答案。
Set NumericScale
property of your parameter to anything in 1-7 range.
更改代码自:
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
至
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 1;
有效。
它甚至可以与针对 SQL Server 2000 的 SQLOLEDB 驱动程序一起使用。
不同数据类型的精度和小数位数
从包含不同数据类型的 SQL 服务器返回行集,我可以询问 OLEDB 各种 T-SQL 数据类型的 Precision
和 NumericScale
是什么:
SQL Server type ADO type Precision NumericScale DefinedSize
---------------- --------------------- --------- ------------ -----------
int adInteger (3) 10 255 4
real adSingle (4) 7 255 4
money adCurrency (6) 19 255 8
bit adBoolean (11) 255 255 2
tinyint adUnsignedTinyInt (17) 3 255 1
bigint adBigInt (20) 19 255 8
uniqueidentifier adGUID (72) 255 255 16
char(35) adChar (129) 255 255 35
nchar(35) adWChar (130) 255 255 35
decimal(15,5) adNumeric (131) 15 5 19
datetime adDBTimeStamp (135) 23 3 16
varchar(35) adVarChar (200) 255 255 35
text adLongVarChar (201) 255 255 2147483647
varchar(max) adLongVarChar (201) 255 255 2147483647
nvarchar(35) adVarWChar (202) 255 255 35
nvarchar(max) adLongVarWChar (203) 255 255 1073741823
xml adLongVarWChar (203) 255 255 1073741823
image adLongVarBinary (205) 255 255 2147483647
varbinary(max) adLongVarBinary (205) 255 255 2147483647
自 SQL 服务器 returns 一个 datetime
字段 NumericScale
为 3; 可能改变是一种美德:
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 1;
至
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 3;
红利阅读
永远不要,永远,永远尝试将datetime
参数化为adDBTimestamp
。 Microsoft SQL 服务器 OLEDB 驱动程序(全部)中存在数据丢失错误:
- SQLOLEDB (1999) - 失败
- SQLNCLI (2005) - 失败
- SQLNCLI10 (2008) - 失败
- SQLNCLI11 (2010) - 失败
- MSOLEDBSQL (2012) - 失败
是将所有 datetime
值参数化为一个字符串(例如 adVarChar
),使用 “ODBC 24 小时格式”:
yyyy-mm-dd hh:mm:ss.zzz
2021-03-21 18:16:22.619
精简版
尝试将 datetime
值 12/30/1899 传递给 SQL 服务器,失败并显示 日期格式无效 - 但仅适用于本机客户端驱动程序,并且仅适用于 DataTypeCompatiblity 模式。
长版
尝试在 ADO 中使用参数化查询时,针对 SQL 服务器:
SELECT ?
我将 datetime
值参数化为 adDBTimeStamp
:
//Language agnostic, vaguely C#-like pseudo-code
void TestIt()
{
DateTime dt = new DateTime("3/15/2020");
VARIANT v = DateTimeToVariant(dt);
Command cmd = new Command();
cmd.CommandText = "SELECT ? AS SomeDate";
cmd.Parameters.Append(cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
Connection cn = GetConnection();
cmd.Set_ActiveConnection(cn);
cmd.Execute(out recordsAffected, EmptyParam, adExecuteNoRecords);
}
当日期为 3/15/2020
时效果很好。
您创建一个 VARIANT
, with a VType
of 7 (VT_DATE
) 和一个 8 字节浮点值的值:
VARIANT
Int32 vt = 7; //VT_DATE
Double date = 0;
但是它在 12/30/1899 失败了
如果我用一个特定的日期时间执行相同的测试代码,它会失败:
void TestIt()
{
DateTime dt = new DateTime("12/30/1899");
VARIANT v = DateTimeToVariant(dt);
Command cmd = new Command();
cmd.CommandText = "SELECT ? AS SomeDate";
cmd.Parameters.Append(cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
Connection cn = GetConnection();
cmd.Set_ActiveConnection(cn);
cmd.Execute(out recordsAffected, EmptyParam, adExecuteNoRecords);
}
ADO OLEDB 提供程序抛出异常(即在它到达 SQL 服务器之前):
Invalid date format
但并非所有 SQL 服务器 OLEDB 供应商都如此
调试此问题时,我意识到所有 SQL 服务器 OLEDB 提供程序都不会发生此问题。 Microsoft 通常为 SQL 服务器提供 4 个 OLE DB 提供程序:
SQLOLEDB
:用于 SQL 服务器的 Microsoft OLE DB 提供程序(自 Windows 2000 起随 Windows 提供)SQLNCLI
:SQL 服务器本机客户端(随 SQL Server 2005 一起提供)SQLNCLI10
:SQL 服务器本机客户端 11.0(随 SQL 服务器 2008 一起提供)SQLNCLI11
:SQL 服务器本机客户端 12.0(随 SQL 服务器 2012 一起提供)MSOLEDBSQL
:用于 SQL 服务器的 Microsoft OLE DB 驱动程序(随 SQL Server 2016 一起提供)
当与一些不同的供应商一起尝试时,确实对某些供应商工作正常:
SQLOLEDB
:有效SQLNCLI11
(没有 DataTypeCompatibility):有效SQLNCLI11
(启用 DataTypeCompatiility):失败
DataTypeCompatibility?
是的。 ActiveX 数据对象 (ADO),一个围绕不友好的 COM OLEDB API 的友好 COM 包装器,不理解新的 date
、time
、xml
、datetime2
, datetimeoffset
数据类型。创建了新的 OLEDB 数据类型常量来表示这些新类型。因此任何现有的 OLEDB 应用程序都无法理解新常量。
为此,一个新的 keyword is supported by the "native" OLE DB drivers:
DataTypeCompatibility=80
您可以将其添加到您的连接字符串中:
"Provider=SQLNCLI11; Data Source=screwdriver; User ID=hatguy; Password=hunter2;DataTypeCompatibility=80;"
这指示 OLEDB 驱动程序仅 return OLEDB 首次发明时存在的 OLEDB 数据类型:
SQL 服务器数据类型 | SQLOLEDB | SQLNCLI | SQLNCLI (w/DataTypeCompatibility=80) |
---|---|---|---|
Xml | adLongVarWChar | 141 (DBTYPE_XML) | adLongVarChar |
日期时间 | adDBTimeStamp | adDBTimeStamp | adDBTimeStamp |
日期时间2 | adVarWChar | adDBTimeStamp | adVarWChar |
日期时间偏移量 | adVarWChar | 146 (DBTYPE_DBTIMESTAMPOFFSET) | adVarWChar |
日期 | adVarWChar | adDBDate | adVarWChar |
时间 | adVarWChar | 145 (DBTYPE_DBTIME2) | adVarWChar |
UDT | 132 (DBTYPE_UDT) | adVarBinary(已记录,未测试) | |
varchar(最大) | adLongVarChar | adLongVarChar | adLongVarChar |
nvarchar(最大) | adLongVarWChar | adLongVarWChar | adLongVarWChar |
varbinary(最大) | adLongVarBinary | adLongVarBinary | adLongVarBinary |
时间戳 | adBinary | adBinary | adBinary |
失败了
时间:
- 试图参数化一个
datetime
值 - 值为
12/30/1899
- 使用 “本机客户端” 驱动程序时
- 并且
DataTypeCompatilibty
开启 - 驱动程序本身对这个值感到窒息
- 当它的值是,实际上完全没问题。
尝试使用日期“12/30/1899”本质上没有错:
SELECT CAST('18991230' AS datetime)
工作正常- 它在原始 OLE DB 驱动程序中工作正常
- 它在 "native" OLE DB 驱动程序 中工作正常
- 它只是在
DataTypeCompatibility
on 的本机驱动程序中失败
显然这是 Microsoft OLE DB 驱动程序中的错误。但这是绝对的事实,微软永远不会,永远,永远,永远 ,修复错误。
那么如何解决呢?
我可以检测到这个特殊的日期时间,我可以尝试解决我们数据访问层中的这个错误。
- 但我需要一个可以放入
VARIANT
结构中的值, - 表示
12/30/1899 12:00:00 AM
- 在
SQOLEDB
下有效
- 及以下
SQLNCLI
xx 个驱动程序 - 及
MSOLEDBSQL
驱动 - 在
DataTypeCompatibilityMode
- (这到底是怎么回事,即使模式关闭了——尽管在没有模式的情况下使用 ADO 是无效的)
T-SQL由驱动生成
当 OLE DB 驱动程序 确实 懒得按照我说的去做时,我们可以分析生成的 RPC:
SQOLEDB
exec sp_executesql N'SELECT @P1 AS SomeDate',N'@P1 datetime','1899-12-30 00:00:00'
SQLNCLI11
exec sp_executesql N'SELECT @P1 AS SomeDate',N'@P1 datetime2(0)','1899-12-30 00:00:00'
CMRE (Delphi)
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ComObj,
ActiveX,
ADOdb,
ADOint,
Variants;
function GetConnection(Provider: string; DataTypeCompatibility: Boolean): _Connection;
var
connectionString: string;
begin
{
SQLOLEDB - Default provider with Windows
SQLNCLI11 - SQL Server 2008 native client
}
connectionString := 'Provider='+Provider+'; Data Source=screwdriver;User ID=hydrogen;Password=hunter2;';
if DataTypeCompatibility then
connectionString := connectionString+'DataTypeCompatibility=80';
Result := CoConnection.Create;
Result.Open(connectionString, '', '', adConnectUnspecified);
end;
procedure Test(ProviderName: string; DataTypeCompatibility: Boolean);
var
dt: TDateTime;
v: OleVariant;
cmd: _Command;
cn: _Connection;
recordsAffected: OleVariant;
s: string;
begin
dt := EncodeDate(1899, 12, 30);// 12/30/1899 12:00:00 AM (also known in Delphi as zero)
v := dt; //the variant is of type VT_DATE (7)
cmd := CoCommand.Create;
cmd.CommandText := 'SELECT ? AS SomeDate';
cmd.Parameters.Append(cmd.CreateParameter('', adDBTimeStamp, adParamInput, 0, v));
try
cn := GetConnection(ProviderName, DataTypeCompatibility);
except
on E: Exception do
begin
WriteLn('Provider '+ProviderName+' not installed: '+E.message);
Exit;
end;
end;
if SameText(ProviderName, 'SQLOLEDB') then
s := ''
else if DataTypeCompatibility then
s := ' (with DataTypeCompatibility)'
else
s := ' (without DataTypeCompatibility)';
cmd.Set_ActiveConnection(cn);
try
cmd.Execute({out}recordsAffected, EmptyParam, adExecuteNoRecords);
WriteLn('Provider '+ProviderName+s+': success.');
except
on E:Exception do
begin
WriteLn('Provider '+ProviderName+s+' failed: '+E.Message);
end;
end;
end;
procedure Main;
begin
CoInitialize(nil);
Test('SQLOLEDB', False); //SQL Server client that ships with Windows since 2000
Test('SQLNCLI', False); //SQL Server 2005 native client
Test('SQLNCLI', True); //SQL Server 2005 native client, w/ DataTypeCompatibilty
Test('SQLNCLI10', False); //SQL Server 2008 native client
Test('SQLNCLI10', True); //SQL Server 2008 native client, w/ DataTypeCompatibilty
Test('SQLNCLI11', False); //SQL Server 2012 native client
Test('SQLNCLI11', True); //SQL Server 2012 native client, w/ DataTypeCompatibilty
Test('MSOLEDBSQL', False); //SQL Server 2016 native client
Test('MSOLEDBSQL', True); //SQL Server 2016 native client, w/ DataTypeCompatibilty
end;
begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
WriteLn('Press enter to close');
ReadLn;
end.
虽然这不是 Delphi 特定的问题;我正在使用 Delphi。所以它被标记为 Delphi。如果你抱怨I'm going to choke your tongue out.
Note: This is not ADO.net, it is ADO. It is not managed .NET Framework Class Library, it is the native Win32 COM OLE DB API.
BrakNicku 找到了答案。
Set
NumericScale
property of your parameter to anything in 1-7 range.
更改代码自:
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
至
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 1;
有效。
它甚至可以与针对 SQL Server 2000 的 SQLOLEDB 驱动程序一起使用。
不同数据类型的精度和小数位数
从包含不同数据类型的 SQL 服务器返回行集,我可以询问 OLEDB 各种 T-SQL 数据类型的 Precision
和 NumericScale
是什么:
SQL Server type ADO type Precision NumericScale DefinedSize
---------------- --------------------- --------- ------------ -----------
int adInteger (3) 10 255 4
real adSingle (4) 7 255 4
money adCurrency (6) 19 255 8
bit adBoolean (11) 255 255 2
tinyint adUnsignedTinyInt (17) 3 255 1
bigint adBigInt (20) 19 255 8
uniqueidentifier adGUID (72) 255 255 16
char(35) adChar (129) 255 255 35
nchar(35) adWChar (130) 255 255 35
decimal(15,5) adNumeric (131) 15 5 19
datetime adDBTimeStamp (135) 23 3 16
varchar(35) adVarChar (200) 255 255 35
text adLongVarChar (201) 255 255 2147483647
varchar(max) adLongVarChar (201) 255 255 2147483647
nvarchar(35) adVarWChar (202) 255 255 35
nvarchar(max) adLongVarWChar (203) 255 255 1073741823
xml adLongVarWChar (203) 255 255 1073741823
image adLongVarBinary (205) 255 255 2147483647
varbinary(max) adLongVarBinary (205) 255 255 2147483647
自 SQL 服务器 returns 一个 datetime
字段 NumericScale
为 3; 可能改变是一种美德:
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 1;
至
Parameter p = cmd.CreateParameter("", adDBTimeStamp, adParamInput, 0, v);
p.NumericScale = 3;
红利阅读
永远不要,永远,永远尝试将datetime
参数化为adDBTimestamp
。 Microsoft SQL 服务器 OLEDB 驱动程序(全部)中存在数据丢失错误:
- SQLOLEDB (1999) - 失败
- SQLNCLI (2005) - 失败
- SQLNCLI10 (2008) - 失败
- SQLNCLI11 (2010) - 失败
- MSOLEDBSQL (2012) - 失败
datetime
值参数化为一个字符串(例如 adVarChar
),使用 “ODBC 24 小时格式”:
yyyy-mm-dd hh:mm:ss.zzz
2021-03-21 18:16:22.619