Exemplo n.º 1
0
 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;
     }
 }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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);
                }
            }
        }