<#@ template language="c#" HostSpecific="True" #> <#@ output extension= ".cs" #> <# TableHost host = (TableHost)(Host); host.Fieldlist.Sort(CodeCommon.CompareByintOrder); #> // Tbl<#= host.GetModelClass(host.TableName) #>.h : CTbl<#= host.GetModelClass(host.TableName) #> 的声明 #pragma once // 代码生成在 2014年9月24日, 17:08 /////////////////////////////////////////////////////////////////////////// // 生成表对应的Insert宏; #define INSERT_<#= host.GetModelClass(host.TableName) #> _T("INSERT INTO [<#= host.GetModelClass(host.TableName) #>](\ <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if( c == host.Fieldlist[host.Fieldlist.Count-1] ) {#> <#= c.ColumnName.ToString().ToLower() #>\ <# } else { #> <#= c.ColumnName.ToString().ToLower() #>,\ <# } #> <# } #> )VALUES(\ <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if( c == host.Fieldlist[host.Fieldlist.Count-1] ) {#> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool") {#> %d<# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#> '%s' <# } #> <# } else { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool") {#> %d,\ <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#> '%s',\ <# } #> <# } #> <# } #>)") /////////////////////////////////////////////////////////////////////////// // 生成表对应的结构体; typedef struct __Tbl_<#= host.GetModelClass(host.TableName) #>__ { <# foreach (ColumnInfo c in host.Fieldlist) { #> <#= CodeCommon.DbTypeToCS(c.TypeName) #> _<#= c.ColumnName.ToString().ToLower() #>; <# } #> }Tbl<#= host.GetModelClass(host.TableName) #>,*pTbl<#= host.GetModelClass(host.TableName) #>; /////////////////////////////////////////////////////////////////////////// INT GetTbl_<#= host.GetModelClass(host.TableName) #>RecordSet(IN CDatabase *pDb, IN CString strFilters, OUT vector>& vtResult); void Insert<#= host.GetModelClass(host.TableName) #>(IN CDatabase* pDb, IN vector> &vtValues); /////////////////////////////////////////////////////////////////////////// class CTbl<#= host.GetModelClass(host.TableName) #> : public CRecordset { public: CTbl<#= host.GetModelClass(host.TableName) #>(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CTbl<#= host.GetModelClass(host.TableName) #>) // 字段/参数数据 // 以下字符串类型(如果存在)反映数据库字段(ANSI 数据类型的 CStringA 和 Unicode // 数据类型的 CString)的实际数据类型。 // 这是为防止 ODBC 驱动程序执行可能 // 不必要的转换。如果希望,可以将这些成员更改为 // CString 类型,ODBC 驱动程序将执行所有必要的转换。 // (注意: 必须使用 3.5 版或更高版本的 ODBC 驱动程序 // 以同时支持 Unicode 和这些转换)。 <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> CString m_<#= c.ColumnName.ToString().ToLower() #>; <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool"|| CodeCommon.DbTypeToCS(c.TypeName)=="image") {#> <#= CodeCommon.DbTypeToCS(c.TypeName) #> m_<#= c.ColumnName.ToString().ToLower() #>; <# } #> <# } #> // 重写 // 向导生成的虚函数重写 public: virtual CString GetDefaultConnect(); // 默认连接字符串 virtual CString GetDefaultSQL(); // 记录集的默认 SQL virtual void DoFieldExchange(CFieldExchange* pFX); // RFX 支持 // 实现 #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif }; //////////////////////////////////////////////////////////////////////////////// // CTbl<#= host.GetModelClass(host.TableName) #> 实现 // 代码生成在 2014年9月24日, 17:08 #include "stdafx.h" #include "Tbl<#= host.GetModelClass(host.TableName) #>.h" IMPLEMENT_DYNAMIC(CTbl<#= host.GetModelClass(host.TableName) #>, CRecordset) CTbl<#= host.GetModelClass(host.TableName) #>::CTbl<#= host.GetModelClass(host.TableName) #>(CDatabase* pdb): CRecordset(pdb) { <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> m_<#= c.ColumnName.ToString().ToLower() #> = _T(""); <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool"|| CodeCommon.DbTypeToCS(c.TypeName)=="image") {#> m_<#= c.ColumnName.ToString().ToLower() #> = 0; <# } #> <# } #> m_nFields = <#= host.Fieldlist.Count #>; // 注意:image类型未生成成员变量,此处值可能不对。 m_nDefaultType = dynaset; } //#error 安全问题:连接字符串可能包含密码。 // 此连接字符串中可能包含明文密码和/或其他重要 // 信息。请在查看完此连接字符串并找到所有与安全 // 有关的问题后移除 #error。可能需要将此密码存 // 储为其他格式或使用其他的用户身份验证。 CString CTbl<#= host.GetModelClass(host.TableName) #>::GetDefaultConnect() { return _T("ODBC;DSN"); } CString CTbl<#= host.GetModelClass(host.TableName) #>::GetDefaultSQL() { return _T("[dbo].[<#= host.GetModelClass(host.TableName) #>]"); } void CTbl<#= host.GetModelClass(host.TableName) #>::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::outputColumn); // RFX_Text() 和 RFX_Int() 这类宏依赖的是 // 成员变量的类型,而不是数据库字段的类型。 // ODBC 尝试自动将列值转换为所请求的类型 <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> RFX_Text(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="int" ){#> RFX_Int(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="bool"){#> RFX_Bool(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="image"){#> RFX_LongBinary(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="binary"){#> RFX_Binary(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="long"){#> RFX_Long(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="double"){#> RFX_Double(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="byte"){#> RFX_Byte(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="float"){#> RFX_Single(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# if (CodeCommon.DbTypeToCS(c.TypeName)=="longlong"){#> RFX_BigInt(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>); <# } #> <# } #> } ///////////////////////////////////////////////////////////////////////////// // CTbl<#= host.GetModelClass(host.TableName) #> 诊断 #ifdef _DEBUG void CTbl<#= host.GetModelClass(host.TableName) #>::AssertValid() const { CRecordset::AssertValid(); } void CTbl<#= host.GetModelClass(host.TableName) #>::Dump(CDumpContext& dc) const { CRecordset::Dump(dc); } #endif //_DEBUG INT GetTbl_<#= host.GetModelClass(host.TableName) #>RecordSet(IN CDatabase *pDb, IN CString strFilters, OUT vector>& vtResult) { if ( pDb == NULL ) return -1; CRecordset myset(pDb); CString strSQL = _T("Select Count(*) as cot from <#= host.GetModelClass(host.TableName) #>"); if (!strFilters.IsEmpty()) strSQL.Format(_T("Select Count(*) as cot from <#= host.GetModelClass(host.TableName) #> where %s"), strFilters); myset.Open(CRecordset::forwardOnly, strSQL); myset.GetFieldValue(_T("cot"), strSQL); myset.Close(); INT nCount = _ttol(strSQL); if ( nCount == 0 ) return 0; CTbl<#= host.GetModelClass(host.TableName) #> rst(pDb); if (!strFilters.IsEmpty()) rst.m_strFilter = strFilters; if ( rst.Open() ) { while( !rst.IsEOF() ) { Tbl<#= host.GetModelClass(host.TableName) #> tagVal; <# foreach (ColumnInfo c in host.Fieldlist){ #> tagVal._<#= c.ColumnName.ToString().ToLower() #> = rst.m_<#= c.ColumnName.ToString().ToLower() #>; <# } #> vtResult.push_back(tagVal); rst.MoveNext(); } rst.Close(); } return nCount; } void Insert<#= host.GetModelClass(host.TableName) #>(IN CDatabase* pDb, IN vector> &vtValues) { if ( pDb == NULL ) return; CString strInsert = _T(""); for ( vector>::iterator it = vtValues.begin(); it != vtValues.end(); it++ ) { strInsert.Format(INSERT_<#= host.GetModelClass(host.TableName) #>, <# foreach ( ColumnInfo c in host.Fieldlist) { #> <# if ( c == host.Fieldlist[host.Fieldlist.Count - 1] ) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool") { #> it->_<#= c.ColumnName.ToString().ToLower() #> <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#> it->_<#= c.ColumnName.ToString().ToLower() #>.c_str() <# } #> <# } else { #><# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"|| CodeCommon.DbTypeToCS(c.TypeName)=="long"|| CodeCommon.DbTypeToCS(c.TypeName)=="float"|| CodeCommon.DbTypeToCS(c.TypeName)=="decimal"|| CodeCommon.DbTypeToCS(c.TypeName)=="bool") { #> it->_<#= c.ColumnName.ToString().ToLower() #>,<# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#> it->_<#= c.ColumnName.ToString().ToLower() #>.c_str(),<# } #><# } #><# } #>); pDb->ExecuteSQL(strInsert); } } ///////////////////////////////////////////////////////////////////////////// // 使用示例 1 void GetReturnValue(IN CArray& AryValue) { CRecordset tagSet(m_pConndb); CString strTemp = _T("select count(*) as cot from [<#= host.GetModelClass(host.TableName) #>]"); tagSet.Open(CRecordset::forwardOnly, strTemp); tagSet.GetFieldValue(_T("cot"), strTemp); tagSet.Close(); // 2.查询指定条件记录; DWORD dwCount = atol(strTemp); DWORD dwOldSize = AryValue.GetSize(); AryValue.SetSize(dwOldSize + dwCount, 1); DWORD dwIndex = dwOldSize == 0 ? 0 : dwOldSize - 1; CTbl<#= host.GetModelClass(host.TableName) #> tagRst(m_pConndb); tagRst.Open(); while( !tagRst.IsEOF() ) { AryValue.ElementAt(dwIndex).RemoveAll(); <#int i = 0;#> <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> AryValue.ElementAt(dwIndex).Add(tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); // <#=i++#>.注释; <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int" || CodeCommon.DbTypeToCS(c.TypeName)=="long" || CodeCommon.DbTypeToCS(c.TypeName)=="decimal"){#> strTemp.Format(_T("%d"),tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); AryValue.ElementAt(dwIndex).Add(strTemp); // <#=i++#>.注释; <# } #> <# } #> dwIndex++; if ( AryValue.GetSize() <= dwIndex ) break; tagRst.MoveNext(); } AryValue.SetSize(dwIndex,1); tagRst.Close(); } ///////////////////////////////////////////////////////////////////////////// // 使用示例 2 void GetReturnValue(IN CArray& AryValue, IN CDatabase* pDatabase, IN CString strFilter) { CRecordset tagSet(pDatabase); CString strTemp = _T("select count(*) as cot from [<#= host.GetModelClass(host.TableName) #>]"); if ( !strFilter.IsEmpty() ) strTemp += _T(" where ") + strFilter; tagSet.Open(CRecordset::forwardOnly, strTemp); tagSet.GetFieldValue(_T("cot"), strTemp); tagSet.Close(); // 2.查询指定条件记录; DWORD dwCount = atol(strTemp); DWORD dwOldSize = AryValue.GetSize(); AryValue.SetSize(dwOldSize + dwCount, 1); DWORD dwIndex = dwOldSize == 0 ? 0 : dwOldSize - 1; CTbl<#= host.GetModelClass(host.TableName) #> tagRst(pDatabase); if ( !strFilter.IsEmpty() ) tagRst.m_strFilter = strFilter; tagRst.Open(); while( !tagRst.IsEOF() ) { AryValue.ElementAt(dwIndex).RemoveAll(); <#int ii = 0;#> <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> AryValue.ElementAt(dwIndex).Add(tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); // <#=ii++#>.注释; <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int" || CodeCommon.DbTypeToCS(c.TypeName)=="long" || CodeCommon.DbTypeToCS(c.TypeName)=="decimal"){#> strTemp.Format(_T("%d"),tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); AryValue.ElementAt(dwIndex).Add(strTemp); // <#=ii++#>.注释; <# } #> <# } #> dwIndex++; if ( AryValue.GetSize() <= dwIndex ) break; tagRst.MoveNext(); } AryValue.SetSize(dwIndex,1); tagRst.Close(); } ///////////////////////////////////////////////////////////////////////////// // 使用示例 3 BYTE* GetReturnValue(IN CArray& AryValue, IN CDatabase* pDatabase, IN CString strFilter) { CRecordset tagSet(pDatabase); CString strTemp = _T("select count(*) as cot from [<#= host.GetModelClass(host.TableName) #>]"); if ( !strFilter.IsEmpty() ) strTemp += _T(" where ") + strFilter; tagSet.Open(CRecordset::forwardOnly, strTemp); tagSet.GetFieldValue(_T("cot"), strTemp); tagSet.Close(); // 2.查询指定条件记录; DWORD dwCount = atol(strTemp); DWORD dwOldSize = AryValue.GetSize(); AryValue.SetSize(dwOldSize + dwCount, 1); DWORD dwIndex = dwOldSize == 0 ? 0 : dwOldSize - 1; CTbl<#= host.GetModelClass(host.TableName) #> tagRst(pDatabase); if ( !strFilter.IsEmpty() ) tagRst.m_strFilter = strFilter; tagRst.Open(); while( !tagRst.IsEOF() ) { AryValue.ElementAt(dwIndex).RemoveAll(); <#int iii = 0;#> <# foreach (ColumnInfo c in host.Fieldlist) { #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#> AryValue.ElementAt(dwIndex).Add(tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); // <#=iii++#>.注释; <# } #> <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int" || CodeCommon.DbTypeToCS(c.TypeName)=="long" || CodeCommon.DbTypeToCS(c.TypeName)=="decimal"){#> strTemp.Format(_T("%d"),tagRst.m_<#= c.ColumnName.ToString().ToLower() #>); AryValue.ElementAt(dwIndex).Add(strTemp); // <#=iii++#>.注释; <# } #> <# } #> dwIndex++; if ( AryValue.GetSize() <= dwIndex ) break; tagRst.MoveNext(); } AryValue.SetSize(dwIndex,1); tagRst.Close(); // 序列化; CMemFile memfile; CArchive ar(&memfile, CArchive::store); for ( int i = 0; i < AryValue.GetSize(); i++) { AryValue.ElementAt(i).Serialize(ar); } ar.Close(); DWORD dwLength = memfile.GetLength(); BYTE* pData = memfile.Detach(); return pData; }