==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于商业出版、商业印刷或学术引用。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4382897.html

=======================================================================

测试表

 1 SET ANSI_NULLS ON
 2 GO
 3 
 4 SET QUOTED_IDENTIFIER ON
 5 GO
 6 
 7 CREATE TABLE [dbo].[testtable](
 8     [id] [int] IDENTITY(1,1) NOT NULL,
 9     [dt] [datetime] NULL,
10     [val] [nvarchar](50) NULL,
11  CONSTRAINT [PK_testtable] PRIMARY KEY CLUSTERED 
12 (
13     [id] ASC
14 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
15 ) ON [PRIMARY]
16 
17 GO

写了个存储过程,其中有个参数:datetime的时间。

1 CREATE PROC testusp_AnEmptyDateTime
2 @dt DATETIME,
3 @val nvarchar(50)
4 AS 
5     INSERT    INTO testtable
6             ( dt,val )
7     VALUES    ( @dt,@val )
8 GO

在命令行里,可以这样写,能运行:

结果:

于是很自然的想要在ADO中试下:

 1 void CTestADOwithProcDlg::OnBnClickedButton2()
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     CoInitialize(NULL);
 5 
 6     _ConnectionPtr pConnection;
 7     pConnection.CreateInstance(TEXT("ADODB.Connection"));
 8     pConnection->ConnectionString=TEXT("File Name=sqlserver_ed.udl");
 9     pConnection->CommandTimeout=10;
10     pConnection->CursorLocation=adUseClient;
11     pConnection->Mode=adModeUnknown;
12     pConnection->Open(TEXT(""),TEXT(""),TEXT(""),adConnectUnspecified);
13 
14     _CommandPtr pCmd;
15     pCmd.CreateInstance(TEXT("ADODB.Command"));
16     pCmd->ActiveConnection=pConnection;    
17     pCmd->CommandText=_bstr_t(TEXT("testusp_AnEmptyDateTime"));
18     pCmd->CommandType=adCmdStoredProc;
19 
20     pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("dt")),adDBTimeStamp,adParamInput,50,_variant_t(TEXT("2015-01-01"))));
21     pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("val")),adVarWChar,adParamInput,50,_variant_t(TEXT("blablabla"))));
22 
23     pCmd->Execute(NULL,NULL,adCmdStoredProc); 
24 
25     CoUninitialize();
26 }

成功。

将第20行换为:

1 pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("dt")),adDBTimeStamp,adParamInput,50,_variant_t(TEXT(""))));

失败。

显然是参数错误。

尝试:

1 pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("dt")),adDBTimeStamp,adParamInput,50));

失败。

又尝试了adEmpty和vtMissing也都是失败的。

=======================================================================

回头想想,在sqlcmd里,虽然说参数是指定了类型的,但实际上输入的都是字符串,只是datetime类型需要“XXXX-XX-XX XX:XX:XX”或者“XXXX/XX/XX XX:XX:XX”的格式。

那么来试下:

1 pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("dt")),adVarWChar,adParamInput,50,_variant_t(TEXT("2015-01-01 11:22:33"))));

成功!

那么这样呢?

1 pCmd->Parameters->Append(pCmd->CreateParameter(_bstr_t(TEXT("dt")),adVarWChar,adParamInput,50,_variant_t(TEXT(""))));

成功!

但时间是默认的上世纪初啊。

=======================================================================

虽然搞懂了一点东西,只要格式正确,可以用字符类型,(效率什么的先不考虑),但会有默认的初始时间。

看来,不想传时间的时候,还是在存储过程里的去掉吧。