PageRenderTime 129ms CodeModel.GetById 27ms RepoModel.GetById 18ms app.codeStats 2ms

/src/RaisingStudio.Data.Providers/Adapters/DataObjectAdapter.cs

#
C# | 5686 lines | 3709 code | 402 blank | 1575 comment | 399 complexity | 2335fd6590c0f44dd55979733801693b MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using RaisingStudio.Data.Common;
  5. using RaisingStudio.Data.Common.Factories;
  6. using RaisingStudio.Data.Expressions;
  7. using RaisingStudio.Data.Common.Builders.Expressions;
  8. using RaisingStudio.Data.Common.Managers;
  9. using System.Data.Common;
  10. using RaisingStudio.Data.Providers.Exceptions;
  11. using System.Data;
  12. namespace RaisingStudio.Data.Providers.Adapters
  13. {
  14. public delegate object CreateDataObjectDelegate();
  15. public delegate System.Collections.IList CreateDataObjectListDelegate();
  16. /// <summary>
  17. /// data object DataAdapter.
  18. /// </summary>
  19. public partial class DataObjectAdapter : DataAdapterBase, RaisingStudio.Data.Common.IDataObjectAdapter
  20. {
  21. #region Common property
  22. protected System.Type dataObjectType;
  23. /// <summary>
  24. /// Type of data object.
  25. /// </summary>
  26. public System.Type DataObjectType
  27. {
  28. get
  29. {
  30. return this.dataObjectType;
  31. }
  32. }
  33. protected string definitionName;
  34. /// <summary>
  35. /// object definition name.
  36. /// </summary>
  37. public string DefinitionName
  38. {
  39. get
  40. {
  41. return this.definitionName;
  42. }
  43. }
  44. protected RaisingStudio.Data.Common.Builders.CommandBuilder commandBuilder;
  45. /// <summary>
  46. /// Command builder.
  47. /// </summary>
  48. public RaisingStudio.Data.Common.Builders.CommandBuilder CommandBuilder
  49. {
  50. get
  51. {
  52. if (this.commandBuilder == null)
  53. {
  54. this.commandBuilder = CreateCommandBuilder();
  55. }
  56. return this.commandBuilder;
  57. }
  58. }
  59. protected System.Data.Common.DataTableMapping defaultDataTableMapping;
  60. /// <summary>
  61. /// default Data table mapping.
  62. /// </summary>
  63. public System.Data.Common.DataTableMapping DefaultDataTableMapping
  64. {
  65. get
  66. {
  67. if (this.defaultDataTableMapping == null)
  68. {
  69. this.defaultDataTableMapping = this.CommandBuilder.CommonCommandBuilder.GetDataTableMapping();
  70. }
  71. return this.defaultDataTableMapping;
  72. }
  73. }
  74. #endregion
  75. #if (PocketPC || Smartphone || WindowsCE)
  76. private bool _useDynamicProxy = false;
  77. #else
  78. private bool _useDynamicProxy = true;
  79. #endif
  80. public bool UseDynamicProxy
  81. {
  82. get { return _useDynamicProxy; }
  83. set { _useDynamicProxy = value; }
  84. }
  85. private bool _cacheDefalutCommand = true;
  86. public bool CacheDefalutCommand
  87. {
  88. get { return _cacheDefalutCommand; }
  89. set { _cacheDefalutCommand = value; }
  90. }
  91. #region Constructor
  92. /// <summary>
  93. /// Constructor
  94. /// </summary>
  95. /// <param name="dataObjectType">Type of data object.</param>
  96. public DataObjectAdapter(System.Type dataObjectType)
  97. {
  98. this.dataObjectType = dataObjectType;
  99. this.connection = ConnectionFactory.CreateConnection();
  100. DatabaseType databaseType;
  101. string providerName;
  102. ConnectionFactory.GetConnectionSetting(out databaseType, out providerName);
  103. this._databaseType = databaseType;
  104. this._providerName = providerName;
  105. this.transactionManager = TransactionManagerFactory.CreateTransactionManager(this.connection);
  106. }
  107. /// <summary>
  108. /// Constructor
  109. /// </summary>
  110. /// <param name="dataObjectType">Type of data object.</param>
  111. /// <param name="connection">database connection.</param>
  112. public DataObjectAdapter(System.Type dataObjectType, System.Data.IDbConnection connection)
  113. {
  114. this.dataObjectType = dataObjectType;
  115. this.connection = connection;
  116. this.transactionManager = TransactionManagerFactory.CreateTransactionManager(this.connection);
  117. }
  118. public DataObjectAdapter(System.Type dataObjectType, System.Data.IDbConnection connection, DatabaseType databaseType, string providerName)
  119. : this(dataObjectType, connection)
  120. {
  121. this._databaseType = databaseType;
  122. this._providerName = providerName;
  123. }
  124. /// <summary>
  125. /// Constructor
  126. /// </summary>
  127. /// <param name="dataObjectType">Type of data object.</param>
  128. /// <param name="transactionManager">database transaction manager.</param>
  129. public DataObjectAdapter(System.Type dataObjectType, TransactionManager transactionManager, ILogManager logManager)
  130. {
  131. this.dataObjectType = dataObjectType;
  132. this.transactionManager = transactionManager;
  133. this.connection = transactionManager.Connection;
  134. this._logManager = logManager;
  135. }
  136. public DataObjectAdapter(System.Type dataObjectType, TransactionManager transactionManager, DatabaseType databaseType, string providerName, ILogManager logManager)
  137. : this(dataObjectType, transactionManager, logManager)
  138. {
  139. this._databaseType = databaseType;
  140. this._providerName = providerName;
  141. }
  142. /// <summary>
  143. /// Constructor
  144. /// </summary>
  145. /// <param name="dataObjectType">Type of data object.</param>
  146. /// <param name="definitionName">object definition name.</param>
  147. public DataObjectAdapter(System.Type dataObjectType, string definitionName)
  148. : this(dataObjectType)
  149. {
  150. this.definitionName = definitionName;
  151. }
  152. /// <summary>
  153. /// Constructor
  154. /// </summary>
  155. /// <param name="dataObjectType">Type of data object.</param>
  156. /// <param name="definitionName">object definition name.</param>
  157. /// <param name="connection">database connection.</param>
  158. public DataObjectAdapter(System.Type dataObjectType, string definitionName, System.Data.IDbConnection connection)
  159. : this(dataObjectType, connection)
  160. {
  161. this.definitionName = definitionName;
  162. }
  163. public DataObjectAdapter(System.Type dataObjectType, string definitionName, System.Data.IDbConnection connection, DatabaseType databaseType, string providerName)
  164. : this(dataObjectType, definitionName, connection)
  165. {
  166. this._databaseType = databaseType;
  167. this._providerName = providerName;
  168. }
  169. /// <summary>
  170. /// Constructor
  171. /// </summary>
  172. /// <param name="dataObjectType">Type of data object.</param>
  173. /// <param name="definitionName">object definition name.</param>
  174. /// <param name="transactionManager">database transaction manager.</param>
  175. public DataObjectAdapter(System.Type dataObjectType, string definitionName, TransactionManager transactionManager, ILogManager logManager)
  176. : this(dataObjectType, transactionManager, logManager)
  177. {
  178. this.definitionName = definitionName;
  179. }
  180. public DataObjectAdapter(System.Type dataObjectType, string definitionName, TransactionManager transactionManager, DatabaseType databaseType, string providerName, ILogManager logManager)
  181. : this(dataObjectType, definitionName, transactionManager, logManager)
  182. {
  183. this._databaseType = databaseType;
  184. this._providerName = providerName;
  185. }
  186. #endregion
  187. #region Create Command
  188. /// <summary>
  189. /// Create a command builder.
  190. /// </summary>
  191. /// <returns>Command builder.</returns>
  192. public virtual RaisingStudio.Data.Common.Builders.CommandBuilder CreateCommandBuilder()
  193. {
  194. DatabaseType databaseType = GetDatabaseType();
  195. #if !(PocketPC || Smartphone || WindowsCE)
  196. if (databaseType == DatabaseType.SHAREPOINT)
  197. {
  198. if (this.definitionName != null)
  199. {
  200. return new RaisingStudio.Data.Common.Builders.SharePointCommandBuilder(this.connection, databaseType, this._providerName, this.dataObjectType, this.definitionName);
  201. }
  202. else
  203. {
  204. return new RaisingStudio.Data.Common.Builders.SharePointCommandBuilder(this.connection, databaseType, this._providerName, this.dataObjectType);
  205. }
  206. }
  207. else
  208. {
  209. #endif
  210. if (this.definitionName != null)
  211. {
  212. return new RaisingStudio.Data.Common.Builders.CommandBuilder(this.connection, databaseType, this._providerName, this.dataObjectType, this.definitionName);
  213. }
  214. else
  215. {
  216. return new RaisingStudio.Data.Common.Builders.CommandBuilder(this.connection, databaseType, this._providerName, this.dataObjectType);
  217. }
  218. #if !(PocketPC || Smartphone || WindowsCE)
  219. }
  220. #endif
  221. }
  222. public virtual DatabaseType GetDatabaseType()
  223. {
  224. if ((this._databaseType == DatabaseType.OTHER) && (!ProviderManager.Instance.ProviderExists(this._providerName)))
  225. {
  226. DatabaseType databaseType = ConnectionFactory.GetDatabaseType(this.connection);
  227. return databaseType;
  228. }
  229. return this._databaseType;
  230. }
  231. #endregion
  232. #region Create data object
  233. protected CreateDataObjectDelegate createDataObjectMethod;
  234. /// <summary>
  235. /// Create data object delegate.
  236. /// </summary>
  237. public CreateDataObjectDelegate CreateDataObjectMethod
  238. {
  239. get
  240. {
  241. return this.createDataObjectMethod;
  242. }
  243. set
  244. {
  245. this.createDataObjectMethod = value;
  246. }
  247. }
  248. /// <summary>
  249. /// Create Data object.
  250. /// </summary>
  251. /// <returns>Data object.</returns>
  252. public virtual object CreateDataObject()
  253. {
  254. if (this.createDataObjectMethod != null)
  255. {
  256. return this.createDataObjectMethod();
  257. }
  258. else
  259. {
  260. if (UseDynamicProxy)
  261. {
  262. #region UseDynamicProxy
  263. IObjectCreater objectCreater = GetObjectCreater(dataObjectType, this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns);
  264. if (objectCreater != null)
  265. {
  266. object dataObject = objectCreater.CreateObject();
  267. return dataObject;
  268. }
  269. else
  270. {
  271. // TODO: exception.
  272. #region Reflection
  273. object dataObject = System.Activator.CreateInstance(this.dataObjectType);
  274. return dataObject;
  275. #endregion
  276. }
  277. #endregion
  278. }
  279. else
  280. {
  281. #region Reflection
  282. object dataObject = System.Activator.CreateInstance(this.dataObjectType);
  283. return dataObject;
  284. #endregion
  285. }
  286. }
  287. }
  288. protected CreateDataObjectListDelegate createDataObjectListMethod;
  289. /// <summary>
  290. /// Create data object column table delegate.
  291. /// </summary>
  292. public CreateDataObjectListDelegate CreateDataObjectListMethod
  293. {
  294. get
  295. {
  296. return this.createDataObjectListMethod;
  297. }
  298. set
  299. {
  300. this.createDataObjectListMethod = value;
  301. }
  302. }
  303. /// <summary>
  304. /// Create data object column table.
  305. /// </summary>
  306. /// <returns>data object column table.</returns>
  307. public virtual System.Collections.IList CreateDataObjectList()
  308. {
  309. if (this.createDataObjectListMethod != null)
  310. {
  311. return this.createDataObjectListMethod();
  312. }
  313. else
  314. {
  315. if (UseDynamicProxy)
  316. {
  317. #region UseDynamicProxy
  318. IObjectCreater objectCreater = GetObjectCreater(dataObjectType, this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns);
  319. if (objectCreater != null)
  320. {
  321. System.Collections.IList dataObjectList = objectCreater.CreateObjectList();
  322. return dataObjectList;
  323. }
  324. else
  325. {
  326. // TODO: exception.
  327. #region Reflection
  328. System.Type listType = typeof(List<>);
  329. System.Type dataObjectListType = listType.MakeGenericType(this.dataObjectType);
  330. System.Collections.IList dataObjectList = System.Activator.CreateInstance(dataObjectListType) as System.Collections.IList;
  331. return dataObjectList;
  332. #endregion
  333. }
  334. #endregion
  335. }
  336. else
  337. {
  338. #region Reflection
  339. System.Type listType = typeof(List<>);
  340. System.Type dataObjectListType = listType.MakeGenericType(this.dataObjectType);
  341. System.Collections.IList dataObjectList = System.Activator.CreateInstance(dataObjectListType) as System.Collections.IList;
  342. return dataObjectList;
  343. #endregion
  344. }
  345. }
  346. }
  347. #endregion
  348. #region Transactions
  349. /// <summary>
  350. /// Begin Database transaction.
  351. /// </summary>
  352. /// <returns>The ID of transaction.</returns>
  353. public virtual string BeginTransaction()
  354. {
  355. return this.transactionManager.BeginTransaction();
  356. }
  357. /// <summary>
  358. /// Begin Database transaction.
  359. /// </summary>
  360. /// <param name="isolationLevel">Specifies the isolation level for the transaction.</param>
  361. /// <returns>The ID of transaction.</returns>
  362. public virtual string BeginTransaction(System.Data.IsolationLevel isolationLevel)
  363. {
  364. return this.transactionManager.BeginTransaction(isolationLevel);
  365. }
  366. /// <summary>
  367. /// Commit Database transaction.
  368. /// </summary>
  369. public virtual void CommitTransaction()
  370. {
  371. this.transactionManager.CommitTransaction();
  372. }
  373. /// <summary>
  374. /// Commit Database transaction.
  375. /// </summary>
  376. /// <param name="transactionID">The ID of transaction.</param>
  377. public virtual void CommitTransaction(string transactionID)
  378. {
  379. this.transactionManager.CommitTransaction(transactionID);
  380. }
  381. /// <summary>
  382. /// Rollback transaction.
  383. /// </summary>
  384. public virtual void RollbackTransaction()
  385. {
  386. this.transactionManager.RollbackTransaction();
  387. }
  388. /// <summary>
  389. /// Rollback transaction.
  390. /// </summary>
  391. /// <param name="transactionID">The ID of transaction.</param>
  392. public virtual void RollbackTransaction(string transactionID)
  393. {
  394. this.transactionManager.RollbackTransaction(transactionID);
  395. }
  396. #endregion
  397. #region Gets primary key value
  398. /// <summary>
  399. /// Gets data object The value of primary key.
  400. /// </summary>
  401. /// <param name="dataObject">Data object.</param>
  402. /// <returns>The value of primary key.</returns>
  403. public virtual object[] GetPrimaryKeys(object dataObject)
  404. {
  405. object[] primaryKeys = new object[this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys.Count];
  406. if (UseDynamicProxy)
  407. {
  408. #region UseDynamicProxy
  409. System.Type dataObjectType = dataObject.GetType();
  410. IObjectAccessor objectAccessor = GetObjectAccessor(dataObjectType, this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns);
  411. if (objectAccessor != null)
  412. {
  413. for (int i = 0; i < this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys.Count; i++)
  414. {
  415. string columnName = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys[i];
  416. primaryKeys[i] = objectAccessor.GetValue(dataObject, columnName);
  417. }
  418. }
  419. else
  420. {
  421. // TODO: exception.
  422. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  423. }
  424. #endregion
  425. }
  426. else
  427. {
  428. if (dataObject is IObjectAccessor)
  429. {
  430. #region IObjectAccessor
  431. IObjectAccessor objectAccessor = dataObject as IObjectAccessor;
  432. if (objectAccessor != null)
  433. {
  434. for (int i = 0; i < this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys.Count; i++)
  435. {
  436. string columnName = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys[i];
  437. primaryKeys[i] = objectAccessor.GetValue(dataObject, columnName);
  438. }
  439. }
  440. #endregion
  441. }
  442. else
  443. {
  444. #region Reflection
  445. System.Type dataObjectType = dataObject.GetType();
  446. for (int i = 0; i < this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys.Count; i++)
  447. {
  448. string columnName = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.PrimaryKeys[i];
  449. System.Reflection.PropertyInfo propertyInfo = dataObjectType.GetProperty(columnName);
  450. if (propertyInfo != null)
  451. {
  452. primaryKeys[i] = propertyInfo.GetValue(dataObject, null);
  453. }
  454. else
  455. {
  456. throw new System.MissingMemberException(string.Format("Can not find a property named {1} in type {0}.", dataObjectType, columnName));
  457. }
  458. }
  459. #endregion
  460. }
  461. }
  462. return primaryKeys;
  463. }
  464. private IObjectCreater GetObjectCreater(Type dataObjectType, Dictionary<string, DataColumnDefinition> columns)
  465. {
  466. return ObjectAccessorManager.Instance.GetObjectAccessor(dataObjectType, columns) as IObjectCreater;
  467. }
  468. private IObjectAccessor GetObjectAccessor(Type dataObjectType, Dictionary<string, DataColumnDefinition> columns)
  469. {
  470. return ObjectAccessorManager.Instance.GetObjectAccessor(dataObjectType, columns);
  471. }
  472. private IObjectAccessor GetObjectAccessor(Type dataObjectType, DataColumnMappingCollection columnMappings)
  473. {
  474. return ObjectAccessorManager.Instance.GetObjectAccessor(dataObjectType, columnMappings);
  475. }
  476. private Type GetDataObjectPropertyType(Type dataObjectType, string propertyName)
  477. {
  478. return ObjectAccessorManager.Instance.GetPropertyType(dataObjectType, propertyName);
  479. }
  480. #endregion
  481. public void SetParameterValue(object parameter, object value)
  482. {
  483. // TODO: convert.
  484. (parameter as System.Data.IDbDataParameter).Value = value;
  485. }
  486. #region protected methods
  487. /// <summary>
  488. /// FillData item.
  489. /// </summary>
  490. /// <param name="command">Command.</param>
  491. /// <param name="dataTableMapping">Data table mapping.</param>
  492. /// <param name="dataObject">Data object.</param>
  493. /// <param name="primaryKeys">The value of primary key.</param>
  494. /// <param name="transaction">Database transaction.</param>
  495. /// <returns>The result of execute command.</returns>
  496. protected int Fill(System.Data.IDbCommand command, System.Data.Common.DataTableMapping dataTableMapping, object dataObject, object[] primaryKeys, System.Data.IDbTransaction transaction)
  497. {
  498. for (int i = 0; i < command.Parameters.Count; i++)
  499. {
  500. SetParameterValue(command.Parameters[i], primaryKeys[i]);
  501. }
  502. if (transaction != null)
  503. {
  504. command.Transaction = transaction;
  505. }
  506. WriteLog(command);
  507. System.Data.IDataReader dataReader = RaisingStudio.Data.Common.Database.ExecuteReaderCommand(command);
  508. try
  509. {
  510. if (dataReader.Read())
  511. {
  512. if (UseDynamicProxy)
  513. {
  514. #region UseDynamicProxy
  515. System.Type dataObjectType = dataObject.GetType();
  516. IObjectAccessor objectAccessor = GetObjectAccessor(dataObjectType, this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns);
  517. SetDataObjectValues(dataReader, dataTableMapping, dataObjectType, objectAccessor, dataObject);
  518. #endregion
  519. }
  520. else
  521. {
  522. if (dataObject is IDataObjectProxy)
  523. {
  524. #region IObjectAccessor
  525. SetDataObjectValues(dataReader, dataTableMapping, dataObject as IDataObjectProxy, dataObject);
  526. #endregion
  527. }
  528. else
  529. {
  530. #region Reflection
  531. System.Type dataObjectType = dataObject.GetType();
  532. SetDataObjectValues(dataReader, dataTableMapping, dataObjectType, dataObject);
  533. #endregion
  534. }
  535. }
  536. }
  537. }
  538. finally
  539. {
  540. if (dataReader != null)
  541. {
  542. dataReader.Close();
  543. }
  544. }
  545. return dataReader.RecordsAffected;
  546. }
  547. private void SetDataObjectValues(System.Data.IDataReader dataReader, System.Data.Common.DataTableMapping dataTableMapping, System.Type dataObjectType, IObjectAccessor objectAccessor, object dataObject)
  548. {
  549. if (objectAccessor != null)
  550. {
  551. foreach (System.Data.Common.DataColumnMapping dataColumnMapping in dataTableMapping.ColumnMappings)
  552. {
  553. string columnName = dataColumnMapping.DataSetColumn;
  554. string sourceName = dataColumnMapping.SourceColumn;
  555. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  556. System.Data.DbType dbType = dataColumnDefinition.DbType;
  557. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  558. if (value == System.DBNull.Value)
  559. {
  560. objectAccessor.SetValue(dataObject, columnName, null);
  561. }
  562. else
  563. {
  564. Type propertyType = GetDataObjectPropertyType(dataObjectType, columnName);
  565. value = ConvertDataValue(dbType, propertyType, value);
  566. objectAccessor.SetValue(dataObject, columnName, value);
  567. }
  568. }
  569. }
  570. else
  571. {
  572. // TODO: exception.
  573. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  574. }
  575. }
  576. private void SetDataObjectValues(System.Data.IDataReader dataReader, System.Data.Common.DataTableMapping dataTableMapping, IDataObjectProxy proxy, object dataObject)
  577. {
  578. if (proxy != null)
  579. {
  580. foreach (System.Data.Common.DataColumnMapping dataColumnMapping in dataTableMapping.ColumnMappings)
  581. {
  582. string columnName = dataColumnMapping.DataSetColumn;
  583. string sourceName = dataColumnMapping.SourceColumn;
  584. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  585. System.Data.DbType dbType = dataColumnDefinition.DbType;
  586. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  587. if (value == System.DBNull.Value)
  588. {
  589. proxy.SetValue(dataObject, columnName, null);
  590. }
  591. else
  592. {
  593. Type propertyType = proxy.GetPropertyType(columnName);
  594. value = ConvertDataValue(dbType, propertyType, value);
  595. proxy.SetValue(dataObject, columnName, value);
  596. }
  597. }
  598. }
  599. else
  600. {
  601. // TODO: exception.
  602. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  603. }
  604. }
  605. private void SetDataObjectValues(System.Data.IDataReader dataReader, System.Data.Common.DataTableMapping dataTableMapping, System.Type dataObjectType, object dataObject)
  606. {
  607. foreach (System.Data.Common.DataColumnMapping dataColumnMapping in dataTableMapping.ColumnMappings)
  608. {
  609. string columnName = dataColumnMapping.DataSetColumn;
  610. string sourceName = dataColumnMapping.SourceColumn;
  611. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  612. System.Data.DbType dbType = dataColumnDefinition.DbType;
  613. System.Reflection.PropertyInfo propertyInfo = dataObjectType.GetProperty(columnName);
  614. if (propertyInfo != null)
  615. {
  616. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  617. if (value == System.DBNull.Value)
  618. {
  619. propertyInfo.SetValue(dataObject, null, null);
  620. }
  621. else
  622. {
  623. value = ConvertDataValue(dbType, propertyInfo.PropertyType, value);
  624. propertyInfo.SetValue(dataObject, value, null);
  625. }
  626. }
  627. else
  628. {
  629. throw new System.MissingMemberException(string.Format("Can not find a property named {1} in type {0}.", dataObjectType, columnName));
  630. }
  631. }
  632. }
  633. private object ConvertDataValue(System.Data.DbType dbType, Type propertyType, object value)
  634. {
  635. return ConverterManager.ConvertDataValue(dbType, propertyType, value);
  636. }
  637. private object ConvertDataValue(Type propertyType, System.Data.DbType dbType, object value)
  638. {
  639. return ConverterManager.ConvertDataValue(propertyType, dbType, value);
  640. }
  641. /// <summary>
  642. /// FillData item.
  643. /// </summary>
  644. /// <param name="command">Command.</param>
  645. /// <param name="dataTableMapping">Data table mapping.</param>
  646. /// <param name="dataObject">Data object.</param>
  647. /// <param name="primaryKeys">The value of primary key.</param>
  648. /// <param name="columnNames">An array of Columns.</param>
  649. /// <param name="transaction">Database transaction.</param>
  650. /// <returns>The result of execute command.</returns>
  651. protected int Fill(System.Data.IDbCommand command, System.Data.Common.DataTableMapping dataTableMapping, object dataObject, object[] primaryKeys, string[] columnNames, System.Data.IDbTransaction transaction)
  652. {
  653. for (int i = 0; i < command.Parameters.Count; i++)
  654. {
  655. SetParameterValue(command.Parameters[i], primaryKeys[i]);
  656. }
  657. if (transaction != null)
  658. {
  659. command.Transaction = transaction;
  660. }
  661. WriteLog(command);
  662. System.Data.IDataReader dataReader = RaisingStudio.Data.Common.Database.ExecuteReaderCommand(command);
  663. try
  664. {
  665. if (dataReader.Read())
  666. {
  667. if (UseDynamicProxy)
  668. {
  669. #region UseDynamicProxy
  670. System.Type dataObjectType = dataObject.GetType();
  671. IObjectAccessor objectAccessor = GetObjectAccessor(dataObjectType, this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns);
  672. SetDataObjectValues(dataTableMapping, dataObject, columnNames, dataReader, dataObjectType, objectAccessor);
  673. #endregion
  674. }
  675. else
  676. {
  677. if (dataObject is IDataObjectProxy)
  678. {
  679. #region IObjectAccessor
  680. IObjectAccessor objectAccessor = dataObject as IObjectAccessor;
  681. SetDataObjectValues(dataTableMapping, dataObject, columnNames, dataReader, dataObject as IDataObjectProxy, objectAccessor);
  682. #endregion
  683. }
  684. else
  685. {
  686. #region Reflection
  687. System.Type dataObjectType = dataObject.GetType();
  688. SetDataObjectValues(dataTableMapping, dataObject, columnNames, dataReader, dataObjectType);
  689. #endregion
  690. }
  691. }
  692. }
  693. }
  694. finally
  695. {
  696. if (dataReader != null)
  697. {
  698. dataReader.Close();
  699. }
  700. }
  701. return dataReader.RecordsAffected;
  702. }
  703. private void SetDataObjectValues(System.Data.Common.DataTableMapping dataTableMapping, object dataObject, string[] columnNames, System.Data.IDataReader dataReader, System.Type dataObjectType, IObjectAccessor objectAccessor)
  704. {
  705. if (objectAccessor != null)
  706. {
  707. foreach (string columnName in columnNames)
  708. {
  709. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  710. string sourceName = RaisingStudio.Data.Common.Builders.CommonCommandBuilder.GetDataColumnSourceColumn(dataTableMapping, columnName);
  711. System.Data.DbType dbType = dataColumnDefinition.DbType;
  712. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  713. if (value == System.DBNull.Value)
  714. {
  715. objectAccessor.SetValue(dataObject, columnName, null);
  716. }
  717. else
  718. {
  719. Type propertyType = GetDataObjectPropertyType(dataObjectType, columnName);
  720. value = ConvertDataValue(dbType, propertyType, value);
  721. objectAccessor.SetValue(dataObject, columnName, value);
  722. }
  723. }
  724. }
  725. else
  726. {
  727. // TODO: exception.
  728. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  729. }
  730. }
  731. private void SetDataObjectValues(System.Data.Common.DataTableMapping dataTableMapping, object dataObject, string[] columnNames, System.Data.IDataReader dataReader, IDataObjectProxy proxy, IObjectAccessor objectAccessor)
  732. {
  733. if (objectAccessor != null)
  734. {
  735. foreach (string columnName in columnNames)
  736. {
  737. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  738. string sourceName = RaisingStudio.Data.Common.Builders.CommonCommandBuilder.GetDataColumnSourceColumn(dataTableMapping, columnName);
  739. System.Data.DbType dbType = dataColumnDefinition.DbType;
  740. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  741. if (value == System.DBNull.Value)
  742. {
  743. objectAccessor.SetValue(dataObject, columnName, null);
  744. }
  745. else
  746. {
  747. Type propertyType = proxy.GetPropertyType(columnName);
  748. value = ConvertDataValue(dbType, propertyType, value);
  749. objectAccessor.SetValue(dataObject, columnName, value);
  750. }
  751. }
  752. }
  753. else
  754. {
  755. // TODO: exception.
  756. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  757. }
  758. }
  759. private void SetDataObjectValues(System.Data.Common.DataTableMapping dataTableMapping, object dataObject, string[] columnNames, System.Data.IDataReader dataReader, System.Type dataObjectType)
  760. {
  761. foreach (string columnName in columnNames)
  762. {
  763. DataColumnDefinition dataColumnDefinition = this.CommandBuilder.CommonCommandBuilder.DataTableDefinition.Columns[columnName];
  764. string sourceName = RaisingStudio.Data.Common.Builders.CommonCommandBuilder.GetDataColumnSourceColumn(dataTableMapping, columnName);
  765. System.Data.DbType dbType = dataColumnDefinition.DbType;
  766. System.Reflection.PropertyInfo propertyInfo = dataObjectType.GetProperty(columnName);
  767. if (propertyInfo != null)
  768. {
  769. object value = DataItemAdapter.GetDataReaderValue(dataReader, sourceName, dbType);
  770. if (value == System.DBNull.Value)
  771. {
  772. propertyInfo.SetValue(dataObject, null, null);
  773. }
  774. else
  775. {
  776. value = ConvertDataValue(dbType, propertyInfo.PropertyType, value);
  777. propertyInfo.SetValue(dataObject, value, null);
  778. }
  779. }
  780. else
  781. {
  782. throw new System.MissingMemberException(string.Format("Can not find a property named {1} in type {0}.", dataObjectType, columnName));
  783. }
  784. }
  785. }
  786. private System.Data.Common.DataTableMapping _defaultDataTableMapping;
  787. private System.Data.IDbCommand _defalutConditionSelectCommand;
  788. /// <summary>
  789. /// Fill Data object.
  790. /// </summary>
  791. /// <param name="dataObject">Data object.</param>
  792. /// <param name="primaryKeys">The value of primary key.</param>
  793. /// <param name="transaction">Database transaction.</param>
  794. /// <returns>The result of execute command.</returns>
  795. protected virtual int Fill(object dataObject, object[] primaryKeys, System.Data.IDbTransaction transaction)
  796. {
  797. if (CacheDefalutCommand)
  798. {
  799. if (_defalutConditionSelectCommand == null)
  800. {
  801. _defalutConditionSelectCommand = this.CommandBuilder.GetConditionSelectCommand(out _defaultDataTableMapping);
  802. }
  803. System.Data.Common.DataTableMapping dataTableMapping = _defaultDataTableMapping;
  804. System.Data.IDbCommand command = _defalutConditionSelectCommand;
  805. return Fill(command, dataTableMapping, dataObject, primaryKeys, transaction);
  806. }
  807. else
  808. {
  809. System.Data.Common.DataTableMapping dataTableMapping;
  810. System.Data.IDbCommand command = this.CommandBuilder.GetConditionSelectCommand(out dataTableMapping);
  811. return Fill(command, dataTableMapping, dataObject, primaryKeys, transaction);
  812. }
  813. }
  814. /// <summary>
  815. /// Fill Data object.
  816. /// </summary>
  817. /// <param name="dataObject">has primary key value Data object.</param>
  818. /// <param name="transaction">Database transaction.</param>
  819. /// <returns>The result of execute command.</returns>
  820. protected virtual int Fill(object dataObject, System.Data.IDbTransaction transaction)
  821. {
  822. return Fill(dataObject, GetPrimaryKeys(dataObject), transaction);
  823. }
  824. /// <summary>
  825. /// Fill Data object.
  826. /// </summary>
  827. /// <param name="dataObject">Data object.</param>
  828. /// <param name="primaryKeys">The value of primary key.</param>
  829. /// <param name="columnNames">An array of Columns.</param>
  830. /// <param name="transaction">Database transaction.</param>
  831. /// <returns>The result of execute command.</returns>
  832. protected virtual int Fill(object dataObject, object[] primaryKeys, string[] columnNames, System.Data.IDbTransaction transaction)
  833. {
  834. System.Data.Common.DataTableMapping dataTableMapping;
  835. System.Data.IDbCommand command = this.CommandBuilder.GetConditionSelectCommand(columnNames, out dataTableMapping);
  836. return Fill(command, dataTableMapping, dataObject, primaryKeys, columnNames, transaction);
  837. }
  838. /// <summary>
  839. /// Fill Data object.
  840. /// </summary>
  841. /// <param name="dataObject">has primary key value Data object.</param>
  842. /// <param name="columnNames">An array of Columns.</param>
  843. /// <param name="transaction">Database transaction.</param>
  844. /// <returns>The result of execute command.</returns>
  845. protected virtual int Fill(object dataObject, string[] columnNames, System.Data.IDbTransaction transaction)
  846. {
  847. return Fill(dataObject, GetPrimaryKeys(dataObject), columnNames, transaction);
  848. }
  849. /// <summary>
  850. /// Gets Data object.
  851. /// </summary>
  852. /// <param name="primaryKeys">The value of primary key.</param>
  853. /// <param name="transaction">Database transaction.</param>
  854. /// <returns>Data object.</returns>
  855. protected virtual object GetData(object[] primaryKeys, System.Data.IDbTransaction transaction)
  856. {
  857. object dataObject = CreateDataObject();
  858. Fill(dataObject, primaryKeys, transaction);
  859. return dataObject;
  860. }
  861. /// <summary>
  862. /// Gets Data object.
  863. /// </summary>
  864. /// <param name="dataObject">has primary key value Data object.</param>
  865. /// <param name="transaction">Database transaction.</param>
  866. /// <returns>Data object.</returns>
  867. protected virtual object GetData(object dataObject, System.Data.IDbTransaction transaction)
  868. {
  869. Fill(dataObject, transaction);
  870. return dataObject;
  871. }
  872. /// <summary>
  873. /// Gets Data object.
  874. /// </summary>
  875. /// <param name="primaryKeys">The value of primary key.</param>
  876. /// <param name="columnNames">An array of Columns.</param>
  877. /// <param name="transaction">Database transaction.</param>
  878. /// <returns>Data object.</returns>
  879. protected virtual object GetData(object[] primaryKeys, string[] columnNames, System.Data.IDbTransaction transaction)
  880. {
  881. object dataObject = CreateDataObject();
  882. Fill(dataObject, primaryKeys, columnNames, transaction);
  883. return dataObject;
  884. }
  885. /// <summary>
  886. /// Gets Data object.
  887. /// </summary>
  888. /// <param name="dataObject">has primary key value Data object.</param>
  889. /// <param name="columnNames">An array of Columns.</param>
  890. /// <param name="transaction">Database transaction.</param>
  891. /// <returns>Data object.</returns>
  892. protected virtual object GetData(object dataObject, string[] columnNames, System.Data.IDbTransaction transaction)
  893. {
  894. Fill(dataObject, columnNames, transaction);
  895. return dataObject;
  896. }
  897. public static bool GetSourceColumnNullMapping(System.Data.IDbDataParameter parameter)
  898. {
  899. return DataParameterManager.GetSourceColumnNullMapping(parameter);
  900. }
  901. private System.Data.IDbCommand _defalutInsertCommand;
  902. /// <summary>
  903. /// Insert Data object.
  904. /// </summary>
  905. /// <param name="dataObject">Data object.</param>
  906. /// <param name="transaction">Database transaction.</param>
  907. /// <returns>The count of rows that updated.</returns>
  908. protected virtual int Insert(object dataObject, System.Data.IDbTransaction transaction)
  909. {
  910. System.Data.IDbCommand command = null;
  911. if (CacheDefalutCommand)
  912. {
  913. if (_defalutInsertCommand == null)
  914. {
  915. _defalutInsertCommand = this.CommandBuilder.GetInsertCommand(this.DefaultDataTableMapping, false);
  916. }
  917. command = _defalutInsertCommand;
  918. }
  919. else
  920. {
  921. command = this.CommandBuilder.GetInsertCommand(this.DefaultDataTableMapping, false);
  922. }
  923. SetInsertCommandParameterValues(dataObject, command);
  924. if (transaction != null)
  925. {
  926. command.Transaction = transaction;
  927. }
  928. WriteLog(command);
  929. return RaisingStudio.Data.Common.Database.ExecuteNonQueryCommand(command);
  930. }
  931. private void SetInsertCommandParameterValues(object dataObject, System.Data.IDbCommand command)
  932. {
  933. if (UseDynamicProxy)
  934. {
  935. #region UseDynamicProxy
  936. System.Type dataObjectType = dataObject.GetType();
  937. IObjectAccessor objectAccessor = GetObjectAccessor(dataObjectType, this.DefaultDataTableMapping.ColumnMappings);
  938. SetParameterValues(dataObject, command, dataObjectType, objectAccessor, true);
  939. #endregion
  940. }
  941. else
  942. {
  943. if (dataObject is IDataObjectProxy)
  944. {
  945. #region IObjectAccessor
  946. IObjectAccessor objectAccessor = dataObject as IObjectAccessor;
  947. SetParameterValues(dataObject, command, dataObject as IDataObjectProxy, objectAccessor, true);
  948. #endregion
  949. }
  950. else
  951. {
  952. #region Reflection
  953. System.Type dataObjectType = dataObject.GetType();
  954. SetParameterValues(dataObject, command, dataObjectType, true);
  955. #endregion
  956. }
  957. }
  958. }
  959. private void SetParameterValues(object dataObject, System.Data.IDbCommand command, System.Type dataObjectType, IObjectAccessor objectAccessor, bool currentVersion)
  960. {
  961. if (objectAccessor != null)
  962. {
  963. foreach (System.Data.IDbDataParameter parameter in command.Parameters)
  964. {
  965. if ((!GetSourceColumnNullMapping(parameter)) && (( currentVersion && (parameter.SourceVersion == System.Data.DataRowVersion.Current)) || (!currentVersion)))
  966. {
  967. string columnName = parameter.SourceColumn;
  968. object value = objectAccessor.GetValue(dataObject, columnName);
  969. if (value == null)
  970. {
  971. parameter.Value = System.DBNull.Value;
  972. }
  973. else
  974. {
  975. Type propertyType = GetDataObjectPropertyType(dataObjectType, columnName);
  976. value = ConvertDataValue(propertyType, parameter.DbType, value);
  977. parameter.Value = value;
  978. }
  979. }
  980. }
  981. }
  982. else
  983. {
  984. // TODO: exception.
  985. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  986. }
  987. }
  988. private void SetParameterValues(object dataObject, System.Data.IDbCommand command, IDataObjectProxy proxy, IObjectAccessor objectAccessor, bool currentVersion)
  989. {
  990. if (objectAccessor != null)
  991. {
  992. foreach (System.Data.IDbDataParameter parameter in command.Parameters)
  993. {
  994. if ((!GetSourceColumnNullMapping(parameter)) && ((currentVersion && (parameter.SourceVersion == System.Data.DataRowVersion.Current)) || (!currentVersion)))
  995. {
  996. string columnName = parameter.SourceColumn;
  997. object value = objectAccessor.GetValue(dataObject, columnName);
  998. if (value == null)
  999. {
  1000. parameter.Value = System.DBNull.Value;
  1001. }
  1002. else
  1003. {
  1004. Type propertyType = proxy.GetPropertyType(columnName);
  1005. value = ConvertDataValue(propertyType, parameter.DbType, value);
  1006. parameter.Value = value;
  1007. }
  1008. }
  1009. }
  1010. }
  1011. else
  1012. {
  1013. // TODO: exception.
  1014. throw new ObjectAccessorException(string.Format("Can't get ObjectAccessor for type [{0}].", dataObjectType));
  1015. }
  1016. }
  1017. private void SetParameterValues(object dataObject, System.Data.IDbCommand command, System.Type dataObjectType, bool currentVersion)
  1018. {
  1019. foreach (System.Data.IDbDataParameter parameter in command.Parameters)
  1020. {
  1021. if ((!GetSourceColumnNullMapping(parameter)) && ((currentVersion && (parameter.SourceVersion == System.Data.DataRowVersion.Current)) || (!currentVersion)))
  1022. {
  1023. string columnName = parameter.SourceColumn;
  1024. System.Reflection.PropertyInfo propertyInfo = dataObjectType.GetProperty(columnName);
  1025. if (propertyInfo != null)
  1026. {
  1027. object value = propertyInfo.GetValue(dataObject, null);
  1028. if (value == null)
  1029. {
  1030. parameter.Value = System.DBNull.Value;
  1031. }
  1032. else
  1033. {
  1034. value = ConvertDataValue(propertyInfo.PropertyType, parameter.DbType, value);
  1035. parameter.Value = value;
  1036. }
  1037. }
  1038. else
  1039. {
  1040. throw new System.MissingMemberException(string.Format("Can not find a property named {1} in type {0}.", dataObjectType, columnName));
  1041. }
  1042. }
  1043. }
  1044. }
  1045. /// <summary>
  1046. /// Insert Data object.
  1047. /// </summary>
  1048. /// <param name="dataObject">Data object.</param>
  1049. /// <param name="columnNames">An array of Columns.</param>
  1050. /// <param name="transaction">Database transaction.</param>
  1051. /// <returns>The count of rows that updated.</r…

Large files files are truncated, but you can click here to view the full file