Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Stream adoStream = null;
- SqlParameter cmdParameter;
- SqlCommand cmd = null;
- SqlDataReader dr = null;
- string cmdText;
- int bytesReturned;
- int chunkSize = 65536;
- int offSet = 0;
- UnicodeEncoding readBytes;
- try
- {
- cmdParameter = new SqlParameter(parameterName, idParamter);
- cmdText = sqlString;
- cmd = new SqlCommand();
- cmd.CommandType = CommandType.Text;
- cmd.CommandTimeout = 0;
- cmd.CommandText = cmdText;
- cmd.Connection = this.pbiSQLConnection;
- cmd.Parameters.Add(cmdParameter);
- dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
- dr.Read();
- if (dr.HasRows)
- {
- readBytes = new UnicodeEncoding();
- byte[] byteChunk = new byte[chunkSize];
- adoStream = new Stream();
- adoStream.Type = StreamTypeEnum.adTypeText;
- adoStream.Open(Type.Missing, ConnectModeEnum.adModeUnknown,
- StreamOpenOptionsEnum.adOpenStreamUnspecified, "", "");
- do
- {
- bytesReturned = (int)dr.GetBytes(0, offSet, byteChunk, 0,
- chunkSize);
- size += bytesReturned;
- if (bytesReturned > 0)
- {
- if (bytesReturned < chunkSize)
- {
- Array.Resize(ref byteChunk, bytesReturned);
- }
- adoStream.WriteText(readBytes.GetString(byteChunk),
- StreamWriteEnum.stWriteChar);
- adoStream.Flush();
- }
- offSet += bytesReturned;
- } while (bytesReturned == chunkSize);
- }
- }
- catch (Exception exLoadResultsFromDB)
- {
- throw (exLoadResultsFromDB);
- }
- finally
- {
- if (dr != null)
- {
- if (!dr.IsClosed)
- {
- dr.Close();
- }
- dr.Dispose();
- }
- if (cmd != null)
- {
- cmd.Dispose();
- }
- }
- adoStream = LoadTextFromDBToADODBStream(resultID, "@result_id",
- "some sql statement", ref size);
- if (adoStream.Size == 0)
- {
- success = false;
- }
- else
- {
- adoStream.Position = 0;
- DataTable table = new DataTable();
- Recordset rs = new Recordset();
- rs.Open(adoStream, Type.Missing, CursorTypeEnum.adOpenStatic,
- LockTypeEnum.adLockBatchOptimistic, -1);
- if (adoStream != null)
- {
- adoStream.Close();
- adoStream = null;
- }
- source.SourceRows = rs.RecordCount;
- table.TableName = "Source";
- source.Dataset = new DataSet();
- source.Dataset.Tables.Add(table);
- OleDbDataAdapter adapter = new OleDbDataAdapter();
- adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
- adapter.Fill(source.Dataset.Tables[0], rs);
- if (adapter != null)
- {
- adapter.Dispose();
- adapter = null;
- }
- if (adoStream != null)
- {
- adoStream.Close();
- adoStream = null;
- }
- if (rs != null)
- {
- if (rs.State == 1)
- {
- rs.Close();
- }
- rs = null;
- }
- }
- SqlConnection CreateConnection()
- {
- // Create the connection here and return it.
- return ...;
- }
- struct ComReference<T> : IDisposable where T : class, new()
- {
- private T reference;
- public T Reference { get { return reference; } }
- public static ComReference<T> Create()
- {
- // Create the instance.
- ComReference<T> retVal = new ComReference<T>();
- // Set the reference.
- retVal.reference = new T();
- // Return.
- return retVal;
- }
- public ComReference<T> Release()
- {
- // Create a copy for return.
- // Note, this is copied on the stack.
- ComReference<T> retVal = this;
- // Set this reference to null;
- this.reference = null;
- // Return the reference.
- return retVal;
- }
- public void Dispose()
- {
- // If there is a reference, then release.
- Marshal.ReleaseComObject(reference);
- }
- }
- ComReference<StreamClass> LoadTextFromDBToADODBStream(int idParameter,
- string parameterName, string sqlString, ref int size)
- {
- int bytesReturned;
- int chunkSize = 65536;
- int offSet = 0;
- // Create the command.
- using (SqlCommand cmd = new SqlCommand())
- {
- // Set the parameters.
- cmd.CommandType = CommandType.Text;
- cmd.CommandTimeout = 0;
- cmd.CommandText = sqlString;
- // See (1).
- using (SqlConnection connection = CreateConnection())
- {
- // Set the connection on the command.
- cmd.Connection = connection;
- // Create the parameter and add to the parameters.
- SqlParameter cmdParameter = new SqlParameter(
- parameterName, idParameter);
- cmd.Parameters.Add(cmdParameter);
- // Create the reader.
- using (SqlDataReader dr = cmd.ExecuteReader(
- CommandBehavior.SequentialAccess))
- {
- dr.Read();
- // See (2)
- if (!dr.HasRows)
- {
- // Return an empty instance.
- return new ComReference<StreamClass>();
- }
- // Create the stream here. See (3)
- using (ComReference<StreamClass> adoStreamClass =
- ComReference<StreamClass>.Create())
- {
- // Get the stream.
- StreamClass adoStream = adoStreamClass.Reference;
- // Open the stream.
- adoStream.Type = StreamTypeEnum.adTypeText;
- adoStream.Open(Type.Missing,
- ConnectModeEnum.adModeUnknown,
- StreamOpenOptionsEnum.adOpenStreamUnspecified,
- "", "");
- // Create the byte array.
- byte[] byteChunk = new byte[chunkSize];
- // See (4)
- Encoding readBytes = Encoding.Unicode;
- // Cycle.
- do
- {
- bytesReturned = (int)dr.GetBytes(0, offSet,
- byteChunk, 0, chunkSize);
- size += bytesReturned;
- if (bytesReturned > 0)
- {
- if (bytesReturned < chunkSize)
- {
- Array.Resize(ref byteChunk,
- bytesReturned);
- }
- adoStream.WriteText(
- readBytes.GetString(byteChunk),
- StreamWriteEnum.stWriteChar);
- adoStream.Flush();
- }
- offSet += bytesReturned;
- } while (bytesReturned == chunkSize);
- // Release the reference and return it.
- // See (5).
- return adoStreamClass.Release();
- }
- }
- }
- }
- }
- // See (1)
- using (ComReference<StreamClass> adoStreamClass =
- LoadTextFromDBToADODBStream(resultID, "@result_id",
- "some sql statement", ref size))
- {
- // Set to the class instance. See (2)
- StreamClass adoStream = adoStreamClass.Reference;
- if (adoStream.Size == 0)
- {
- success = false;
- }
- else
- {
- adoStream.Position = 0;
- DataTable table = new DataTable();
- // See (3)
- using (ComReference<RecordsetClass> rsClass =
- ComReference<RecordsetClass>.Create())
- {
- Recordset rs = rsClass.Reference;
- rs.Open(adoStream, Type.Missing, CursorTypeEnum.adOpenStatic,
- LockTypeEnum.adLockBatchOptimistic, -1);
- if (adoStream != null)
- {
- adoStream.Close();
- adoStream = null;
- }
- source.SourceRows = rs.RecordCount;
- table.TableName = "Source";
- source.Dataset = new DataSet();
- source.Dataset.Tables.Add(table);
- // See (4)
- using (OleDbDataAdapter adapter = new OleDbDataAdapter())
- {
- adapter.MissingSchemaAction =
- MissingSchemaAction.AddWithKey;
- adapter.Fill(source.Dataset.Tables[0], rs);
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment