code_junkie

Convert persisted ADO 2.8 COM recordset to ADO.Net DataSet

Nov 13th, 2011
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.14 KB | None | 0 0
  1. Stream adoStream = null;
  2. SqlParameter cmdParameter;
  3. SqlCommand cmd = null;
  4. SqlDataReader dr = null;
  5.  
  6. string cmdText;
  7. int bytesReturned;
  8. int chunkSize = 65536;
  9. int offSet = 0;
  10.  
  11. UnicodeEncoding readBytes;
  12.  
  13. try
  14. {
  15. cmdParameter = new SqlParameter(parameterName, idParamter);
  16.  
  17. cmdText = sqlString;
  18.  
  19. cmd = new SqlCommand();
  20. cmd.CommandType = CommandType.Text;
  21. cmd.CommandTimeout = 0;
  22. cmd.CommandText = cmdText;
  23. cmd.Connection = this.pbiSQLConnection;
  24. cmd.Parameters.Add(cmdParameter);
  25. dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
  26. dr.Read();
  27.  
  28. if (dr.HasRows)
  29. {
  30. readBytes = new UnicodeEncoding();
  31. byte[] byteChunk = new byte[chunkSize];
  32.  
  33. adoStream = new Stream();
  34. adoStream.Type = StreamTypeEnum.adTypeText;
  35. adoStream.Open(Type.Missing, ConnectModeEnum.adModeUnknown,
  36. StreamOpenOptionsEnum.adOpenStreamUnspecified, "", "");
  37.  
  38. do
  39. {
  40. bytesReturned = (int)dr.GetBytes(0, offSet, byteChunk, 0,
  41. chunkSize);
  42. size += bytesReturned;
  43. if (bytesReturned > 0)
  44. {
  45. if (bytesReturned < chunkSize)
  46. {
  47. Array.Resize(ref byteChunk, bytesReturned);
  48. }
  49.  
  50. adoStream.WriteText(readBytes.GetString(byteChunk),
  51. StreamWriteEnum.stWriteChar);
  52. adoStream.Flush();
  53. }
  54.  
  55. offSet += bytesReturned;
  56. } while (bytesReturned == chunkSize);
  57. }
  58. }
  59. catch (Exception exLoadResultsFromDB)
  60. {
  61. throw (exLoadResultsFromDB);
  62. }
  63. finally
  64. {
  65. if (dr != null)
  66. {
  67. if (!dr.IsClosed)
  68. {
  69. dr.Close();
  70. }
  71.  
  72. dr.Dispose();
  73. }
  74.  
  75. if (cmd != null)
  76. {
  77. cmd.Dispose();
  78. }
  79. }
  80.  
  81. adoStream = LoadTextFromDBToADODBStream(resultID, "@result_id",
  82. "some sql statement", ref size);
  83. if (adoStream.Size == 0)
  84. {
  85. success = false;
  86. }
  87. else
  88. {
  89. adoStream.Position = 0;
  90.  
  91. DataTable table = new DataTable();
  92. Recordset rs = new Recordset();
  93. rs.Open(adoStream, Type.Missing, CursorTypeEnum.adOpenStatic,
  94. LockTypeEnum.adLockBatchOptimistic, -1);
  95.  
  96. if (adoStream != null)
  97. {
  98. adoStream.Close();
  99. adoStream = null;
  100. }
  101.  
  102. source.SourceRows = rs.RecordCount;
  103. table.TableName = "Source";
  104. source.Dataset = new DataSet();
  105. source.Dataset.Tables.Add(table);
  106.  
  107. OleDbDataAdapter adapter = new OleDbDataAdapter();
  108. adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  109. adapter.Fill(source.Dataset.Tables[0], rs);
  110.  
  111. if (adapter != null)
  112. {
  113. adapter.Dispose();
  114. adapter = null;
  115. }
  116.  
  117. if (adoStream != null)
  118. {
  119. adoStream.Close();
  120. adoStream = null;
  121. }
  122.  
  123. if (rs != null)
  124. {
  125. if (rs.State == 1)
  126. {
  127. rs.Close();
  128. }
  129.  
  130. rs = null;
  131. }
  132. }
  133.  
  134. SqlConnection CreateConnection()
  135. {
  136. // Create the connection here and return it.
  137. return ...;
  138. }
  139.  
  140. struct ComReference<T> : IDisposable where T : class, new()
  141. {
  142. private T reference;
  143.  
  144. public T Reference { get { return reference; } }
  145.  
  146. public static ComReference<T> Create()
  147. {
  148. // Create the instance.
  149. ComReference<T> retVal = new ComReference<T>();
  150.  
  151. // Set the reference.
  152. retVal.reference = new T();
  153.  
  154. // Return.
  155. return retVal;
  156. }
  157.  
  158. public ComReference<T> Release()
  159. {
  160. // Create a copy for return.
  161. // Note, this is copied on the stack.
  162. ComReference<T> retVal = this;
  163.  
  164. // Set this reference to null;
  165. this.reference = null;
  166.  
  167. // Return the reference.
  168. return retVal;
  169. }
  170.  
  171. public void Dispose()
  172. {
  173. // If there is a reference, then release.
  174. Marshal.ReleaseComObject(reference);
  175. }
  176. }
  177.  
  178. ComReference<StreamClass> LoadTextFromDBToADODBStream(int idParameter,
  179. string parameterName, string sqlString, ref int size)
  180. {
  181. int bytesReturned;
  182. int chunkSize = 65536;
  183. int offSet = 0;
  184.  
  185. // Create the command.
  186. using (SqlCommand cmd = new SqlCommand())
  187. {
  188. // Set the parameters.
  189. cmd.CommandType = CommandType.Text;
  190. cmd.CommandTimeout = 0;
  191. cmd.CommandText = sqlString;
  192.  
  193. // See (1).
  194. using (SqlConnection connection = CreateConnection())
  195. {
  196. // Set the connection on the command.
  197. cmd.Connection = connection;
  198.  
  199. // Create the parameter and add to the parameters.
  200. SqlParameter cmdParameter = new SqlParameter(
  201. parameterName, idParameter);
  202. cmd.Parameters.Add(cmdParameter);
  203.  
  204. // Create the reader.
  205. using (SqlDataReader dr = cmd.ExecuteReader(
  206. CommandBehavior.SequentialAccess))
  207. {
  208. dr.Read();
  209.  
  210. // See (2)
  211. if (!dr.HasRows)
  212. {
  213. // Return an empty instance.
  214. return new ComReference<StreamClass>();
  215. }
  216.  
  217. // Create the stream here. See (3)
  218. using (ComReference<StreamClass> adoStreamClass =
  219. ComReference<StreamClass>.Create())
  220. {
  221. // Get the stream.
  222. StreamClass adoStream = adoStreamClass.Reference;
  223.  
  224. // Open the stream.
  225. adoStream.Type = StreamTypeEnum.adTypeText;
  226. adoStream.Open(Type.Missing,
  227. ConnectModeEnum.adModeUnknown,
  228. StreamOpenOptionsEnum.adOpenStreamUnspecified,
  229. "", "");
  230.  
  231. // Create the byte array.
  232. byte[] byteChunk = new byte[chunkSize];
  233.  
  234. // See (4)
  235. Encoding readBytes = Encoding.Unicode;
  236.  
  237. // Cycle.
  238. do
  239. {
  240. bytesReturned = (int)dr.GetBytes(0, offSet,
  241. byteChunk, 0, chunkSize);
  242. size += bytesReturned;
  243. if (bytesReturned > 0)
  244. {
  245. if (bytesReturned < chunkSize)
  246. {
  247. Array.Resize(ref byteChunk,
  248. bytesReturned);
  249. }
  250.  
  251. adoStream.WriteText(
  252. readBytes.GetString(byteChunk),
  253. StreamWriteEnum.stWriteChar);
  254. adoStream.Flush();
  255. }
  256.  
  257. offSet += bytesReturned;
  258. } while (bytesReturned == chunkSize);
  259.  
  260. // Release the reference and return it.
  261. // See (5).
  262. return adoStreamClass.Release();
  263. }
  264. }
  265. }
  266. }
  267. }
  268.  
  269. // See (1)
  270. using (ComReference<StreamClass> adoStreamClass =
  271. LoadTextFromDBToADODBStream(resultID, "@result_id",
  272. "some sql statement", ref size))
  273. {
  274. // Set to the class instance. See (2)
  275. StreamClass adoStream = adoStreamClass.Reference;
  276.  
  277. if (adoStream.Size == 0)
  278. {
  279. success = false;
  280. }
  281. else
  282. {
  283. adoStream.Position = 0;
  284.  
  285. DataTable table = new DataTable();
  286.  
  287. // See (3)
  288. using (ComReference<RecordsetClass> rsClass =
  289. ComReference<RecordsetClass>.Create())
  290. {
  291. Recordset rs = rsClass.Reference;
  292. rs.Open(adoStream, Type.Missing, CursorTypeEnum.adOpenStatic,
  293. LockTypeEnum.adLockBatchOptimistic, -1);
  294.  
  295. if (adoStream != null)
  296. {
  297. adoStream.Close();
  298. adoStream = null;
  299. }
  300.  
  301. source.SourceRows = rs.RecordCount;
  302. table.TableName = "Source";
  303. source.Dataset = new DataSet();
  304. source.Dataset.Tables.Add(table);
  305.  
  306. // See (4)
  307. using (OleDbDataAdapter adapter = new OleDbDataAdapter())
  308. {
  309. adapter.MissingSchemaAction =
  310. MissingSchemaAction.AddWithKey;
  311. adapter.Fill(source.Dataset.Tables[0], rs);
  312. }
  313. }
  314. }
  315. }
Add Comment
Please, Sign In to add comment