public SqlStream(SqlCommand p_SqlCommand, ISqlValueSerializer p_SqlValueSerializer, DuplicateColumnNameProcess p_DuplicateColumnNameProcess = DuplicateColumnNameProcess.DuplicateNameException, IEnumerable <ISqlStreamHeader> p_SqlStreamHeader = null, Action <DataTable> p_DataTableSchemaCreated = null) { _DataReader = p_SqlCommand.ExecuteReader(CommandBehavior.CloseConnection); try { _StreamEngine = new SqlStreamEngine(_DataReader, new MemoryStream(), p_SqlValueSerializer, p_DuplicateColumnNameProcess, p_SqlStreamHeader, p_DataTableSchemaCreated); } catch { _DataReader.Close(); _DataReader.Dispose(); throw; } }
public SqlStreamEngine(SqlDataReader p_DataReader, Stream p_Stream, ISqlValueSerializer p_SqlValueSerializer, DuplicateColumnNameProcess p_DuplicateColumnNameProcess, IEnumerable <ISqlStreamHeader> p_SqlStreamHeader, Action <DataTable> p_DataTableSchemaCreated = null) { _DataReader = p_DataReader; _BufferStream = p_Stream; _SqlValueSerializer = p_SqlValueSerializer; _DuplicateColumnNameProcess = p_DuplicateColumnNameProcess; var table = _DataReader.GetSchemaTable(); DataTableWithoutData = new DataTable(); foreach (DataRow row in table.Rows) { var columnName = row["ColumnName"].ToString(); var dataType = Type.GetType(row["DataType"].ToString()) ?? throw new Exception("SqlDataReader.GetSchemaTable must return column with name DataType"); if ((_DuplicateColumnNameProcess == DuplicateColumnNameProcess.DuplicateColumnsWithNamePostfixWithData || _DuplicateColumnNameProcess == DuplicateColumnNameProcess.DuplicateColumnsWithNamePostfixWithoutData) && DataTableWithoutData.Columns.Contains(columnName)) { var uniqueColumnName = UniqueColumnName(columnName, DataTableWithoutData.Columns); var column = new DataColumn(uniqueColumnName, dataType); column.ExtendedProperties[OriginalColumnName] = columnName; _DuplicateNameExceptionPreventUsed = true; DataTableWithoutData.Columns.Add(column); continue; } DataTableWithoutData.Columns.Add(new DataColumn(columnName, dataType)); } p_DataTableSchemaCreated?.Invoke(DataTableWithoutData); if (p_SqlStreamHeader != null) { foreach (var sh in p_SqlStreamHeader) { sh.WriteToStream(_BufferStream, DataTableWithoutData); } } _StreamLengthWithValidData = _BufferStream.Position; }
private DataTable SelectDuplicateColumn(DuplicateColumnNameProcess p_DuplicateColumnNameProcess) { using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString)) { conn.Open(); var sql = "SELECT 'A' as ColumnA, 'B' as ColumnA FROM TestTable"; var cmd = new SqlCommand(sql, conn); using (var sqlDataReaderStream = new SqlStream(cmd, new SqlValueSerializerCsvSimple(), p_DuplicateColumnNameProcess)) { Assert.AreEqual(2, sqlDataReaderStream.DataTableWithoutData.Columns.Count); Assert.AreEqual("ColumnA", sqlDataReaderStream.DataTableWithoutData.Columns[0].ColumnName); Assert.AreEqual("ColumnA_1", sqlDataReaderStream.DataTableWithoutData.Columns[1].ColumnName); //must read data to prepared table DataTable table = sqlDataReaderStream.DataTableWithoutData; new StreamToDataTableRows().ReadStreamToDataTable(sqlDataReaderStream, table, new SqlValueSerializerCsvSimple()); Assert.AreEqual("A", table.Rows[0][0].ToString()); return(table); } } }