<#@ 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) #>; /////////////////////////////////////////////////////////////////////////// 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 支持 static INT GetTbl_<#= host.GetModelClass(host.TableName) #>RecordSet(IN CDatabase *pDb, IN CString strFilters, OUT vector>& vtResult); static void Insert<#= host.GetModelClass(host.TableName) #>(IN CDatabase* pDb, IN vector> &vtValues); // 实现 #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 CTbl<#= host.GetModelClass(host.TableName) #>::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; try { 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(); } } catch(CDBException *e) { #ifdef _DEBUG Global::WriteTextLog(_T("文件:%s,函数:%s, 错误信息:%s, 条件:%s"), __FILE__, __FUNCTION__, e->m_strError, strFilters); e->Delete(); #endif } return nCount; } void CTbl<#= host.GetModelClass(host.TableName) #>::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(),<# } #><# } #><# } #>); try{ pDb->ExecuteSQL(strInsert); } catch(CDBException *e) { #ifdef _DEBUG Global::WriteTextLog(_T("文件:%s,函数:%s, 错误信息:%s, 条件:%s"), __FILE__, __FUNCTION__, e->m_strError, strInsert); e->Delete(); #endif } } }