RecordSet.cmt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <#@ template language="c#" HostSpecific="True" #>
  2. <#@ output extension= ".cs" #>
  3. <#
  4. TableHost host = (TableHost)(Host);
  5. host.Fieldlist.Sort(CodeCommon.CompareByintOrder);
  6. #>
  7. // Tbl<#= host.GetModelClass(host.TableName) #>.h : CTbl<#= host.GetModelClass(host.TableName) #> 的声明
  8. #pragma once
  9. // 代码生成在 2014年9月24日, 17:08
  10. ///////////////////////////////////////////////////////////////////////////
  11. // 生成表对应的Insert宏;
  12. #define INSERT_<#= host.GetModelClass(host.TableName) #> _T("INSERT INTO [<#= host.GetModelClass(host.TableName) #>](\
  13. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  14. <# if( c == host.Fieldlist[host.Fieldlist.Count-1] ) {#>
  15. <#= c.ColumnName.ToString().ToLower() #>\
  16. <# } else { #>
  17. <#= c.ColumnName.ToString().ToLower() #>,\
  18. <# } #>
  19. <# } #>
  20. )VALUES(\
  21. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  22. <# if( c == host.Fieldlist[host.Fieldlist.Count-1] ) {#>
  23. <# if (
  24. CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  25. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  26. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  27. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  28. CodeCommon.DbTypeToCS(c.TypeName)=="bool")
  29. {#>
  30. %d\
  31. <# } #>
  32. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime")
  33. {#>
  34. '%s'\
  35. <# } #>
  36. <# } else { #>
  37. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  38. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  39. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  40. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  41. CodeCommon.DbTypeToCS(c.TypeName)=="bool")
  42. {#>
  43. %d,\
  44. <# } #>
  45. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime")
  46. {#>
  47. '%s',\
  48. <# } #>
  49. <# } #>
  50. <# } #>)")
  51. ///////////////////////////////////////////////////////////////////////////
  52. // 生成表对应的结构体;
  53. typedef struct __Tbl_<#= host.GetModelClass(host.TableName) #>__
  54. {
  55. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  56. <#= CodeCommon.DbTypeToCS(c.TypeName) #> _<#= c.ColumnName.ToString().ToLower() #>;
  57. <# } #>
  58. }Tbl<#= host.GetModelClass(host.TableName) #>,*pTbl<#= host.GetModelClass(host.TableName) #>;
  59. ///////////////////////////////////////////////////////////////////////////
  60. class CTbl<#= host.GetModelClass(host.TableName) #> : public CRecordset
  61. {
  62. public:
  63. CTbl<#= host.GetModelClass(host.TableName) #>(CDatabase* pDatabase = NULL);
  64. DECLARE_DYNAMIC(CTbl<#= host.GetModelClass(host.TableName) #>)
  65. // 字段/参数数据
  66. // 以下字符串类型(如果存在)反映数据库字段(ANSI 数据类型的 CStringA 和 Unicode
  67. // 数据类型的 CString)的实际数据类型。
  68. // 这是为防止 ODBC 驱动程序执行可能
  69. // 不必要的转换。如果希望,可以将这些成员更改为
  70. // CString 类型,ODBC 驱动程序将执行所有必要的转换。
  71. // (注意: 必须使用 3.5 版或更高版本的 ODBC 驱动程序
  72. // 以同时支持 Unicode 和这些转换)。
  73. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  74. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#>
  75. CString m_<#= c.ColumnName.ToString().ToLower() #>; <# } #>
  76. <# if (
  77. CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  78. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  79. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  80. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  81. CodeCommon.DbTypeToCS(c.TypeName)=="bool"||
  82. CodeCommon.DbTypeToCS(c.TypeName)=="image")
  83. {#> <#= CodeCommon.DbTypeToCS(c.TypeName) #> m_<#= c.ColumnName.ToString().ToLower() #>;
  84. <# } #> <# } #>
  85. // 重写
  86. // 向导生成的虚函数重写
  87. public:
  88. virtual CString GetDefaultConnect(); // 默认连接字符串
  89. virtual CString GetDefaultSQL(); // 记录集的默认 SQL
  90. virtual void DoFieldExchange(CFieldExchange* pFX); // RFX 支持
  91. static INT GetTbl_<#= host.GetModelClass(host.TableName) #>RecordSet(IN CDatabase *pDb, IN CString strFilters, OUT vector<Tbl<#= host.GetModelClass(host.TableName) #>>& vtResult);
  92. static void Insert<#= host.GetModelClass(host.TableName) #>(IN CDatabase* pDb, IN vector<Tbl<#= host.GetModelClass(host.TableName) #>> &vtValues);
  93. // 实现
  94. #ifdef _DEBUG
  95. virtual void AssertValid() const;
  96. virtual void Dump(CDumpContext& dc) const;
  97. #endif
  98. };
  99. ////////////////////////////////////////////////////////////////////////////////
  100. // CTbl<#= host.GetModelClass(host.TableName) #> 实现
  101. // 代码生成在 2014年9月24日, 17:08
  102. #include "stdafx.h"
  103. #include "Tbl<#= host.GetModelClass(host.TableName) #>.h"
  104. IMPLEMENT_DYNAMIC(CTbl<#= host.GetModelClass(host.TableName) #>, CRecordset)
  105. CTbl<#= host.GetModelClass(host.TableName) #>::CTbl<#= host.GetModelClass(host.TableName) #>(CDatabase* pdb): CRecordset(pdb)
  106. {
  107. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  108. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#>
  109. m_<#= c.ColumnName.ToString().ToLower() #> = _T(""); <# } #>
  110. <# if (
  111. CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  112. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  113. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  114. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  115. CodeCommon.DbTypeToCS(c.TypeName)=="bool"||
  116. CodeCommon.DbTypeToCS(c.TypeName)=="image")
  117. {#> m_<#= c.ColumnName.ToString().ToLower() #> = 0; <# } #>
  118. <# } #>
  119. m_nFields = <#= host.Fieldlist.Count #>; // 注意:image类型未生成成员变量,此处值可能不对。
  120. m_nDefaultType = dynaset;
  121. }
  122. //#error 安全问题:连接字符串可能包含密码。
  123. // 此连接字符串中可能包含明文密码和/或其他重要
  124. // 信息。请在查看完此连接字符串并找到所有与安全
  125. // 有关的问题后移除 #error。可能需要将此密码存
  126. // 储为其他格式或使用其他的用户身份验证。
  127. CString CTbl<#= host.GetModelClass(host.TableName) #>::GetDefaultConnect()
  128. {
  129. return _T("ODBC;DSN");
  130. }
  131. CString CTbl<#= host.GetModelClass(host.TableName) #>::GetDefaultSQL()
  132. {
  133. return _T("[dbo].[<#= host.GetModelClass(host.TableName) #>]");
  134. }
  135. void CTbl<#= host.GetModelClass(host.TableName) #>::DoFieldExchange(CFieldExchange* pFX)
  136. {
  137. pFX->SetFieldType(CFieldExchange::outputColumn);
  138. // RFX_Text() 和 RFX_Int() 这类宏依赖的是
  139. // 成员变量的类型,而不是数据库字段的类型。
  140. // ODBC 尝试自动将列值转换为所请求的类型
  141. <# foreach (ColumnInfo c in host.Fieldlist) { #>
  142. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime"){#>
  143. RFX_Text(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  144. <# } #>
  145. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="int" ){#>
  146. RFX_Int(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  147. <# } #>
  148. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="bool"){#>
  149. RFX_Bool(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  150. <# } #>
  151. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="image"){#>
  152. RFX_LongBinary(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  153. <# } #>
  154. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="binary"){#>
  155. RFX_Binary(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  156. <# } #>
  157. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="long"){#>
  158. RFX_Long(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  159. <# } #>
  160. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="double"){#>
  161. RFX_Double(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  162. <# } #>
  163. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="byte"){#>
  164. RFX_Byte(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  165. <# } #>
  166. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="float"){#>
  167. RFX_Single(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  168. <# } #>
  169. <# if (CodeCommon.DbTypeToCS(c.TypeName)=="longlong"){#>
  170. RFX_BigInt(pFX, _T("<#= c.ColumnName.ToString().ToLower() #>"), m_<#= c.ColumnName.ToString().ToLower() #>);
  171. <# } #>
  172. <# } #>
  173. }
  174. /////////////////////////////////////////////////////////////////////////////
  175. // CTbl<#= host.GetModelClass(host.TableName) #> 诊断
  176. #ifdef _DEBUG
  177. void CTbl<#= host.GetModelClass(host.TableName) #>::AssertValid() const
  178. {
  179. CRecordset::AssertValid();
  180. }
  181. void CTbl<#= host.GetModelClass(host.TableName) #>::Dump(CDumpContext& dc) const
  182. {
  183. CRecordset::Dump(dc);
  184. }
  185. #endif //_DEBUG
  186. INT CTbl<#= host.GetModelClass(host.TableName) #>::GetTbl_<#= host.GetModelClass(host.TableName) #>RecordSet(IN CDatabase *pDb, IN CString strFilters, OUT vector<Tbl<#= host.GetModelClass(host.TableName) #>>& vtResult)
  187. {
  188. if ( pDb == NULL )
  189. return -1;
  190. CRecordset myset(pDb);
  191. CString strSQL = _T("Select Count(*) as cot from <#= host.GetModelClass(host.TableName) #>");
  192. if (!strFilters.IsEmpty())
  193. strSQL.Format(_T("Select Count(*) as cot from <#= host.GetModelClass(host.TableName) #> where %s"), strFilters);
  194. myset.Open(CRecordset::forwardOnly, strSQL);
  195. myset.GetFieldValue(_T("cot"), strSQL);
  196. myset.Close();
  197. INT nCount = _ttol(strSQL);
  198. if ( nCount == 0 )
  199. return 0;
  200. try
  201. {
  202. CTbl<#= host.GetModelClass(host.TableName) #> rst(pDb);
  203. if (!strFilters.IsEmpty())
  204. rst.m_strFilter = strFilters;
  205. if ( rst.Open() )
  206. {
  207. while( !rst.IsEOF() )
  208. {
  209. Tbl<#= host.GetModelClass(host.TableName) #> tagVal;
  210. <# foreach (ColumnInfo c in host.Fieldlist){ #>
  211. tagVal._<#= c.ColumnName.ToString().ToLower() #> = rst.m_<#= c.ColumnName.ToString().ToLower() #>;
  212. <# } #>
  213. vtResult.push_back(tagVal);
  214. rst.MoveNext();
  215. }
  216. rst.Close();
  217. }
  218. }
  219. catch(CDBException *e)
  220. {
  221. #ifdef _DEBUG
  222. Global::WriteTextLog(_T("文件:%s,函数:%s, 错误信息:%s, 条件:%s"), __FILE__, __FUNCTION__, e->m_strError, strFilters);
  223. e->Delete();
  224. #endif
  225. }
  226. return nCount;
  227. }
  228. void CTbl<#= host.GetModelClass(host.TableName) #>::Insert<#= host.GetModelClass(host.TableName) #>(IN CDatabase* pDb, IN vector<Tbl<#= host.GetModelClass(host.TableName) #>> &vtValues)
  229. {
  230. if ( pDb == NULL )
  231. return;
  232. CString strInsert = _T("");
  233. for ( vector<Tbl<#= host.GetModelClass(host.TableName) #>>::iterator it = vtValues.begin(); it != vtValues.end(); it++ )
  234. {
  235. strInsert.Format(INSERT_<#= host.GetModelClass(host.TableName) #>, <# foreach ( ColumnInfo c in host.Fieldlist) { #>
  236. <# if ( c == host.Fieldlist[host.Fieldlist.Count - 1] ) { #>
  237. <# if (
  238. CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  239. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  240. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  241. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  242. CodeCommon.DbTypeToCS(c.TypeName)=="bool") { #>
  243. it->_<#= c.ColumnName.ToString().ToLower() #> <# } #>
  244. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#>
  245. it->_<#= c.ColumnName.ToString().ToLower() #>.c_str() <# } #>
  246. <# } else { #><# if (
  247. CodeCommon.DbTypeToCS(c.TypeName)=="int"||
  248. CodeCommon.DbTypeToCS(c.TypeName)=="long"||
  249. CodeCommon.DbTypeToCS(c.TypeName)=="float"||
  250. CodeCommon.DbTypeToCS(c.TypeName)=="decimal"||
  251. CodeCommon.DbTypeToCS(c.TypeName)=="bool") { #>
  252. it->_<#= c.ColumnName.ToString().ToLower() #>,<# } #>
  253. <# if ( CodeCommon.DbTypeToCS(c.TypeName)=="string" || CodeCommon.DbTypeToCS(c.TypeName)=="DateTime") {#>
  254. it->_<#= c.ColumnName.ToString().ToLower() #>.c_str(),<# } #><# } #><# } #>);
  255. try{
  256. pDb->ExecuteSQL(strInsert);
  257. }
  258. catch(CDBException *e)
  259. {
  260. #ifdef _DEBUG
  261. Global::WriteTextLog(_T("文件:%s,函数:%s, 错误信息:%s, 条件:%s"), __FILE__, __FUNCTION__, e->m_strError, strInsert);
  262. e->Delete();
  263. #endif
  264. }
  265. }
  266. }