我这样写了一个,但不知道怎样赋空值:
DBTIMESTAMP tmpTime;
tmpTime.Day = 0;
tmpTime.Month = 0;
tmpTime.Year = 0;
tmpTime.Hour = 0;
......objOLEDB.A = tmpTime;
objOLEDB.Insert();
但是这样写不行,该怎样设置这些值呢? -- 请教各位大侠!
DBTIMESTAMP tmpTime;
tmpTime.Day = 0;
tmpTime.Month = 0;
tmpTime.Year = 0;
tmpTime.Hour = 0;
......objOLEDB.A = tmpTime;
objOLEDB.Insert();
但是这样写不行,该怎样设置这些值呢? -- 请教各位大侠!
字段A为NULL(从SQLSERVER看)是什么意思?
如果你想把实际的值设为NULL,上述方法就可以,如果你想显示出来NULL,那你需要用case语句。
语法如下:
SELECT A,B,C
CASE A
WHEN NULL THEN 'NULL'
END
FROM 表名
strTemp.day = 0;
strTemp.month = 0;
strTemp.year = 0;
strTemp.hour = 0;
strTemp.minute = 0;
strTemp.second = 0;
strTemp.fraction = 0; CdboLocationTest CTest; HRESULT hr = CTest.Open(); CTest.m_ID = intTemp;
CTest.m_TimeTest = NULL;
hr = CTest.Insert ();VC的代码是这样的,但是通不过,与SQLSERVER无关。
hr = CTest.Insert ();
也报错?不可能吧?如果报错,就是数据库的问题。
如果该语句能执行则证明SQLSERVER没问题。
在程序中,用Execute发出SQL命令,这样总可以把
int intTemp;
intTemp = 1;strTemp.day = 1;
strTemp.month = 1;
strTemp.year = 2001;
strTemp.hour = 0;
strTemp.minute = 0;
strTemp.second = 0;
strTemp.fraction = 0;CdboLocationTest CTest;HRESULT hr = CTest.Open();CTest.m_ID = intTemp;
CTest.m_TimeTest = strTemp;
hr = CTest.Insert ();
这样是可以的,要是不设置m_TimeTest的值(数据库允许为NULL,该字段为DATETIME)要怎么办?
数据库没问题的!
{
public:
int m_ID;
DATE m_Time;BEGIN_COLUMN_MAP(MyData)
COLUMN_ENTRY_TYPE(1, DBTYPE_I4, m_ID)
COLUMN_ENTRY_TYPE(2, DBTYPE_DATE, m_Time)
END_COLUMN_MAP()
};CDataSource ds;
CSession session;
CCommand <CAccessor<MyData> > cust;然后,———— CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true);
dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, "");
dbinit.AddProperty(DBPROP_AUTH_USERID, "Admin");
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, "D:\\test.mdb");
dbinit.AddProperty(DBPROP_INIT_MODE, (long)16);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, "");
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false); HRESULT hr = ds.OpenWithServiceComponents("Microsoft.Jet.OLEDB.4.0", &dbinit);
if(FAILED(hr))
{
AfxMessageBox("error!");
return ;
} session.Open(ds);
CString strSQL= "SELECT * FROM Test";
cust.Open(session, strSQL);在上面的代码中连接的是access数据库,我的机器里没装SQL SERVER,道理相同—— CString strSQL="INSERT INTO test (ID) VALUES (46)";
cust.Close();
cust.Open(session,strSQL,NULL,NULL,DBGUID_DBSQL,FALSE);
cust.Close();
这样就执行了一句无返回的SQL语句,进行了insert操作,并且datetime的字段为空您明白了吗???
{
public:
LONG m_ID;BEGIN_COLUMN_MAP(CdboLocationTestAccessor)
COLUMN_ENTRY(1, m_dwUserId)
END_COLUMN_MAP()DEFINE_COMMAND(CdboLocationTestAccessor, _T(" SELECT ID FROM dbo.LocationTest")) // You may wish to call this function if you are inserting a record and wish to
// initialize all the fields, if you are not going to explicitly set all of them.
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};
可做如下改动,不设置m_TimeTest的值试试class CdboLocationTestAccessor
{
public:
LONG m_ID;BEGIN_COLUMN_MAP(CdboLocationTestAccessor)
COLUMN_ENTRY(1, m_ID)
END_COLUMN_MAP()DEFINE_COMMAND(CdboLocationTestAccessor, _T(" SELECT ID FROM dbo.LocationTest")) // You may wish to call this function if you are inserting a record and wish to
// initialize all the fields, if you are not going to explicitly set all of them.
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};
可做如下改动,不设置m_TimeTest的值,再试试class CdboLocationTestAccessor
{
public:
LONG m_ID;BEGIN_COLUMN_MAP(CdboLocationTestAccessor)
COLUMN_ENTRY(1, m_ID)
END_COLUMN_MAP()DEFINE_COMMAND(CdboLocationTestAccessor, _T(" SELECT ID FROM dbo.LocationTest")) // You may wish to call this function if you are inserting a record and wish to
// initialize all the fields, if you are not going to explicitly set all of them.
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};
这个需要另外一个OLEDB宏.BEGIN_COLUMN_MAP(MyData)
COLUMN_ENTRY_TYPE(1, DBTYPE_I4, m_ID)
COLUMN_ENTRY_TYPE(2, DBTYPE_DATE, m_Time)
//Insert this
COLUMN_ENTRY_STATUS(2, m_Time, m_timeStatus )
END_COLUMN_MAP()
然后,
CdboLocationTest CTest;HRESULT hr = CTest.Open();CTest.m_ID = intTemp;/*
通知Provider第2个Field的值为空.如果要取缺省值,设置m_timeStatus=DBSTATUS_S_DEFAULT即可
*/CTest.m_timeStatus = DBSTATUS_S_ISNULL;
/*
The value sent to the provider is NULL. The provider ignores the contents of the value and length parts of the consumer's buffer.
*/hr = CTest.Insert ();
ATLASSERT(hr == S_OK);
另外,这个我也没有试过,理论应该如此.