2
0

DbDataAdapter.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. //
  2. // System.Data.Common.DbDataAdapter.cs
  3. //
  4. // Author:
  5. // Rodrigo Moya ([email protected])
  6. // Tim Coleman ([email protected])
  7. //
  8. // (C) Ximian, Inc
  9. // Copyright (C) 2002 Tim Coleman
  10. //
  11. using System.Collections;
  12. using System.Data;
  13. namespace System.Data.Common
  14. {
  15. /// <summary>
  16. /// Aids implementation of the IDbDataAdapter interface. Inheritors of DbDataAdapter implement a set of functions to provide strong typing, but inherit most of the functionality needed to fully implement a DataAdapter.
  17. /// </summary>
  18. public abstract class DbDataAdapter : DataAdapter, ICloneable
  19. {
  20. #region Fields
  21. public const string DefaultSourceTableName = "Table";
  22. #endregion
  23. #region Constructors
  24. protected DbDataAdapter()
  25. {
  26. }
  27. #endregion
  28. #region Properties
  29. IDbCommand DeleteCommand {
  30. get { return ((IDbDataAdapter)this).DeleteCommand; }
  31. }
  32. IDbCommand InsertCommand {
  33. get { return ((IDbDataAdapter)this).InsertCommand; }
  34. }
  35. IDbCommand SelectCommand {
  36. get { return ((IDbDataAdapter)this).SelectCommand; }
  37. }
  38. IDbCommand UpdateCommand {
  39. get { return ((IDbDataAdapter)this).UpdateCommand; }
  40. }
  41. #endregion
  42. #region Methods
  43. protected abstract RowUpdatedEventArgs CreateRowUpdatedEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
  44. protected abstract RowUpdatingEventArgs CreateRowUpdatingEvent (DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping);
  45. [MonoTODO]
  46. protected override void Dispose (bool disposing)
  47. {
  48. throw new NotImplementedException ();
  49. }
  50. public override int Fill (DataSet dataSet)
  51. {
  52. return Fill (dataSet, DefaultSourceTableName);
  53. }
  54. public int Fill (DataTable dataTable)
  55. {
  56. return Fill (dataTable.DataSet, dataTable.TableName);
  57. }
  58. public int Fill (DataSet dataSet, string srcTable)
  59. {
  60. return Fill (dataSet, 0, 0, srcTable);
  61. }
  62. protected virtual int Fill (DataTable dataTable, IDataReader dataReader)
  63. {
  64. return Fill (dataTable.DataSet, dataTable.TableName, dataReader, 0, 0);
  65. }
  66. protected virtual int Fill (DataTable dataTable, IDbCommand command, CommandBehavior behavior)
  67. {
  68. return Fill (dataTable.DataSet, 0, 0, dataTable.TableName, command, behavior);
  69. }
  70. public int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable)
  71. {
  72. return this.Fill (dataSet, startRecord, maxRecords, srcTable, SelectCommand, CommandBehavior.Default);
  73. }
  74. protected virtual int Fill (DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords)
  75. {
  76. if (startRecord < 0)
  77. throw new ArgumentException ("The startRecord parameter was less than 0.");
  78. if (maxRecords < 0)
  79. throw new ArgumentException ("The maxRecords parameter was less than 0.");
  80. DataTable table;
  81. int readCount = 0;
  82. int resultCount = 0;
  83. string tableName = srcTable;
  84. string baseColumnName;
  85. string baseTableName;
  86. string columnName;
  87. ArrayList primaryKey;
  88. bool resultsFound;
  89. object[] itemArray;
  90. DataTableMapping tableMapping;
  91. DataRow row; // FIXME needed for incorrect operation below.
  92. do {
  93. if (dataSet.Tables.Contains (tableName))
  94. table = dataSet.Tables[tableName];
  95. else
  96. table = new DataTable (tableName);
  97. primaryKey = new ArrayList ();
  98. foreach (DataRow schemaRow in dataReader.GetSchemaTable ().Rows)
  99. {
  100. // generate a unique column name in the dataset table.
  101. if (schemaRow["BaseColumnName"].Equals (DBNull.Value))
  102. baseColumnName = "Column";
  103. else
  104. baseColumnName = (string) schemaRow ["BaseColumnName"];
  105. columnName = baseColumnName;
  106. for (int i = 1; table.Columns.Contains (columnName); i += 1)
  107. columnName = String.Format ("{0}{1}", baseColumnName, i);
  108. if (schemaRow["BaseTableName"].Equals (DBNull.Value))
  109. baseTableName = "Table";
  110. else
  111. baseTableName = (string) schemaRow ["BaseTableName"];
  112. tableMapping = DataTableMappingCollection.GetTableMappingBySchemaAction (TableMappings, tableName, baseTableName, MissingMappingAction);
  113. // check to see if the column mapping exists
  114. if (tableMapping.ColumnMappings.IndexOfDataSetColumn (baseColumnName) < 0)
  115. {
  116. if (MissingSchemaAction == MissingSchemaAction.Error)
  117. throw new SystemException ();
  118. table.Columns.Add (columnName, (Type) schemaRow ["DataType"]);
  119. tableMapping.ColumnMappings.Add (columnName, baseColumnName);
  120. }
  121. if (!TableMappings.Contains (tableMapping))
  122. TableMappings.Add (tableMapping);
  123. if (!schemaRow["IsKey"].Equals (DBNull.Value))
  124. if ((bool) (schemaRow["IsKey"]))
  125. primaryKey.Add (table.Columns[columnName]);
  126. }
  127. if (MissingSchemaAction == MissingSchemaAction.AddWithKey && primaryKey.Count > 0)
  128. table.PrimaryKey = (DataColumn[])(primaryKey.ToArray());
  129. for (int k = 0; k < startRecord; k += 1)
  130. dataReader.Read ();
  131. resultsFound = false;
  132. itemArray = new object[dataReader.FieldCount];
  133. while (dataReader.Read () && !(maxRecords > 0 && readCount >= maxRecords))
  134. {
  135. dataReader.GetValues (itemArray);
  136. row = table.Rows.Add (itemArray);
  137. if (AcceptChangesDuringFill)
  138. row.AcceptChanges ();
  139. /* FIXME
  140. this is the way it should be done, but LoadDataRow has not been implemented yet.
  141. table.BeginLoadData ();
  142. table.LoadDataRow (itemArray, AcceptChangesDuringFill);
  143. table.EndLoadData ();
  144. */
  145. readCount += 1;
  146. resultsFound = true;
  147. }
  148. if (resultsFound)
  149. {
  150. dataSet.Tables.Add (table);
  151. tableName = String.Format ("{0}{1}", srcTable, ++resultCount);
  152. }
  153. startRecord = 0;
  154. maxRecords = 0;
  155. } while (dataReader.NextResult ());
  156. dataReader.Close ();
  157. return readCount;
  158. }
  159. protected virtual int Fill (DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior)
  160. {
  161. if (command.Connection.State == ConnectionState.Closed)
  162. {
  163. command.Connection.Open ();
  164. behavior |= CommandBehavior.CloseConnection;
  165. }
  166. return this.Fill (dataSet, srcTable, command.ExecuteReader (behavior), startRecord, maxRecords);
  167. }
  168. [MonoTODO]
  169. public override DataTable[] FillSchema (DataSet dataSet, SchemaType schemaType)
  170. {
  171. throw new NotImplementedException ();
  172. }
  173. [MonoTODO]
  174. public DataTable FillSchema (DataTable dataTable, SchemaType schemaType)
  175. {
  176. throw new NotImplementedException ();
  177. }
  178. [MonoTODO]
  179. public DataTable[] FillSchema (DataSet dataSet, SchemaType schemaType, string srcTable)
  180. {
  181. throw new NotImplementedException ();
  182. }
  183. [MonoTODO]
  184. protected virtual DataTable FillSchema (DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior)
  185. {
  186. throw new NotImplementedException ();
  187. }
  188. [MonoTODO]
  189. protected virtual DataTable[] FillSchema (DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior)
  190. {
  191. throw new NotImplementedException ();
  192. }
  193. [MonoTODO]
  194. public override IDataParameter[] GetFillParameters ()
  195. {
  196. throw new NotImplementedException ();
  197. }
  198. [MonoTODO]
  199. object ICloneable.Clone ()
  200. {
  201. throw new NotImplementedException ();
  202. }
  203. [MonoTODO]
  204. public int Update (DataRow[] dataRows)
  205. {
  206. throw new NotImplementedException ();
  207. }
  208. [MonoTODO]
  209. public override int Update (DataSet ds)
  210. {
  211. throw new NotImplementedException ();
  212. }
  213. [MonoTODO]
  214. public int Update (DataTable dt)
  215. {
  216. throw new NotImplementedException ();
  217. }
  218. [MonoTODO]
  219. protected virtual int Update (DataRow[] row, DataTableMapping dtm)
  220. {
  221. throw new NotImplementedException ();
  222. }
  223. [MonoTODO]
  224. public int Update (DataSet ds, string s)
  225. {
  226. throw new NotImplementedException ();
  227. }
  228. [MonoTODO]
  229. protected virtual void OnFillError (FillErrorEventArgs value)
  230. {
  231. throw new NotImplementedException ();
  232. }
  233. protected abstract void OnRowUpdated (RowUpdatedEventArgs value);
  234. protected abstract void OnRowUpdating (RowUpdatingEventArgs value);
  235. #endregion
  236. #region Events
  237. public event FillErrorEventHandler FillError;
  238. #endregion
  239. }
  240. }