==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于商业出版、商业印刷或学术引用。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接: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(""))));
成功!
但时间是默认的上世纪初啊。
=======================================================================
虽然搞懂了一点东西,只要格式正确,可以用字符类型,(效率什么的先不考虑),但会有默认的初始时间。
看来,不想传时间的时候,还是在存储过程里的去掉吧。