Penyebab:
SSIS gagal membaca file dan menampilkan peringatan di bawah ini karena pembatas kolom Ç
("c" dengan cedilla ) dan not
karena pembatas baris {LF}
(Umpan Baris ).
[Read flat file [1]] Warning: The end of the data file was reached while
reading header rows. Make sure the header row delimiter and the number of
header rows to skip are correct.
Berikut adalah contoh paket SSIS yang menunjukkan cara mengatasi masalah menggunakan Script Component
dan pada akhirnya ada contoh lain yang mensimulasikan masalah Anda.
Resolusi:
Contoh paket di bawah ini ditulis dalam SSIS 2008 R2
. Itu membaca file datar dengan pembatas baris {LF}
sebagai nilai kolom tunggal; kemudian pisahkan data menggunakan Script Component
untuk memasukkan informasi ke dalam tabel di SQL Server 2008 R2
basis data.
Gunakan Notepad++
untuk membuat file datar sederhana dengan beberapa baris. File contoh di bawah ini memiliki Id Produk dan Harga Jual informasi pada setiap baris dipisahkan oleh Ç
sebagai pembatas kolom dan setiap baris diakhiri dengan {LF}
pembatas.
Pada Notepad++, klik Encoding
lalu klik Encoding in UTF-8
untuk menyimpan file datar di UTF-8
pengkodean.
Sampel akan menggunakan SQL Server 2008 R2
database bernama Sora
. Buat tabel baru bernama dbo.ProductListPrice
menggunakan skrip yang diberikan di bawah ini. SSIS akan memasukkan data file datar ke dalam tabel ini.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Buat paket SSIS menggunakan Business Intelligence Development Studio (BIDS) 2008 R2 . Beri nama paket sebagai SO_6268205.dtsx
. Buat sumber data bernama Sora.ds
untuk terhubung ke database Sora
di SQL Server 2008 R2 .
Klik kanan di mana saja di dalam paket, lalu klik Variables
untuk melihat panel variabel. Buat variabel baru bernama ColumnDelimiter
tipe data String
dalam cakupan paket SO_6268205
dan atur variabel dengan nilai Ç
Klik kanan pada Connection Managers
dan klik New Flat File Connection...
untuk membuat koneksi untuk membaca file datar.
Pada General
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:
- Setel Nama pengelola koneksi ke
ProductListPrice
- Setel Deskripsi ke
Flat file connection manager to read product list price information.
- Pilih jalur file datar. Saya memiliki file di jalur
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
- Pilih
{LF}
dari Pembatas Baris Header - Periksa
Column names in the first data row
- Klik
Columns
halaman
Pada Columns
halaman Editor Pengelola Koneksi File Datar , pastikan Column delimiter
kosong dan dinonaktifkan. Klik Advanced
halaman.
Pada Advanced
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut.
- Setel Nama ke
LineData
- Pastikan bahwa Pembatas kolom disetel ke
{LF}
- Setel Tipe Data ke
Unicode string [DT_WSTR]
- Setel OutputColumnWidth ke
255
- Klik
Preview
halaman.
Di Preview
halaman Editor Pengelola Koneksi File Datar , verifikasi bahwa data yang ditampilkan terlihat benar dan klik OK
.
Anda akan melihat sumber data Sora dan manajer koneksi file datar ProductListPrice di Connection Managers
tab di bagian bawah paket.
Seret dan lepas Data Flow Task
ke Alur Kontrol tab paket dan beri nama sebagai File to database - Without Cedilla delimiter
Klik dua kali Tugas Aliran Data untuk mengalihkan tampilan ke Data Flow
tab pada paket. Seret dan lepas Flat File Source
pada Alur Data tab. Klik dua kali Sumber File Datar untuk membuka Flat File Source Editor
.
Di Connection Managers
halaman Editor Sumber File Datar , pilih Pengelola Koneksi File Datar ProductListPrice
dan klik Kolom halaman.
Pada Columns
halaman Editor Sumber File Datar , centang kolom LineData
dan klik OK
.
Seret dan lepas Script Component
ke Alur Data tab di bawah Sumber File Datar , pilih Transformation
dan klik OK
. Hubungkan panah hijau dari Sumber File Datar ke Komponen Skrip . Klik dua kali Komponen Skrip untuk membuka Script Transformation Editor
.
Klik Masukkan Kolom di Editor Transformasi Skrip dan pilih LineData
kolom. Klik Masukan dan Keluaran halaman.
Pada Inputs and Outputs
halaman Editor Transformasi Skrip , lakukan tindakan berikut.
- Ubah nama input menjadi FlatFileInput
- Ubah nama keluaran menjadi
SplitDataOutput
- Pilih Kolom Keluaran dan klik
Add Column
. Ulangi ini lagi untuk menambahkan kolom lain. - Beri nama kolom pertama
ProductId
- Setel Tipe Data kolom ProductId ke
Unicode string [DT_WSTR]
- Setel Panjang ke
30
Pada Inputs and Outputs
halaman Editor Transformasi Skrip , lakukan tindakan berikut.
- Beri nama kolom kedua
ListPrice
- Setel Tipe Data dari kolom ListPrice ke
numeric [DT_NUMERIC]
- Setel Presisi ke
12
- Setel Skala ke
2
- Klik Skrip halaman untuk memodifikasi skrip
Pada Script
halaman Editor Transformasi Skrip , lakukan tindakan berikut.
- Klik tombol elipsis pada ReadOnlyVariables dan pilih variabel
User::ColumnDelimiter
- Klik
Edit Script...
Rekatkan C # di bawah ini di Editor Skrip. Script melakukan tugas-tugas berikut.
- Menggunakan nilai pembatas kolom
Ç
didefinisikan dalam variabel User::ColumnDelimiter , metodeFlatFileInput_ProcessInputRow
membagi nilai yang masuk dan menetapkannya ke dua kolom keluaran yang ditentukan dalam transformasi Komponen Skrip.
Kode komponen skrip dalam C#
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row)
{
const int COL_PRODUCT = 0;
const int COL_PRICE = 1;
char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter);
string[] lineData = Row.LineData.ToString().Split(delimiter);
Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT])
? String.Empty
: lineData[COL_PRODUCT];
Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE])
? 0
: Convert.ToDecimal(lineData[COL_PRICE]);
}
}
Seret dan lepas OLE DB Destination
ke Alur Data tab. Hubungkan panah hijau dari Komponen Skrip ke Tujuan OLE DB . Klik dua kali Tujuan OLE DB untuk membuka OLE DB Destination Editor
.
Di Connection Managers
halaman Editor Tujuan OLE DB , lakukan tindakan berikut.
- Pilih
Sora
dari OLE DB Connection Manager - Pilih
Table or view - fast load
dari Mode akses data - Pilih
[dbo].[ProductListPrice]
dari Nama tabel atau tampilan - Klik Pemetaan halaman
Klik Mappings
halaman di Editor Tujuan OLE DB akan secara otomatis memetakan kolom jika nama kolom input dan output sama. Klik OK
.
Alur Data tab akan terlihat seperti ini setelah mengonfigurasi semua komponen.
Jalankan kueri select * from dbo.ProductListPrice
di SQL Server Management Studio (SSMS) untuk menemukan jumlah baris dalam tabel. Itu harus kosong sebelum mengeksekusi paket.
Jalankan paket. Anda akan melihat bahwa paket berhasil diproses 9 baris. File datar berisi 10 baris tetapi baris pertama adalah header dengan nama kolom.
Jalankan kueri select * from dbo.ProductListPrice
di SQL Server Management Studio (SSMS) untuk menemukan 9 baris berhasil dimasukkan ke dalam tabel. Data harus sesuai dengan data file datar.
Contoh di atas mengilustrasikan cara membagi data secara manual menggunakan Komponen Skrip karena Pengelola Koneksi File Datar menemukan kesalahan saat mengonfigurasi pembatas kolom Ç
Simulasi Masalah:
Contoh ini menunjukkan Pengelola Koneksi File Datar separate yang terpisah dikonfigurasi dengan pembatas kolom Ç
, yang dijalankan tetapi menemui peringatan dan tidak memproses baris apa pun.
Klik kanan pada Connection Managers
dan klik New Flat File Connection...
untuk membuat koneksi untuk membaca file datar. Pada General
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:
- Setel Nama pengelola koneksi ke
ProductListPrice_Cedilla
- Setel Deskripsi ke
Flat file connection manager with Cedilla column delimiter.
- Saya memiliki file di jalur
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
Pilih jalur file datar. - Pilih
{LF}
dari Pembatas Baris Header - Periksa
Column names in the first data row
- Klik
Columns
halaman
Pada Columns
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:
- Setel Pembatas baris ke
{LF}
- Bidang pembatas kolom mungkin dinonaktifkan. Klik
Reset Columns
- Setel Pembatas kolom ke
Ç
- Klik
Advanced
halaman
Pada Advanced
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:
- Setel Nama ke
ProductId
- Setel ColumnDelimiter ke
Ç
- Setel Tipe Data ke
Unicode string [DT_WSTR]
- Setel Panjang ke
30
- Klik kolom
ListPrice
Pada Advanced
halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:
- Setel Nama ke
ListPrice
- Setel ColumnDelimiter ke
{LF}
- Setel Tipe Data ke
numeric [DT_NUMERIC]
- Setel DataPrecision ke
12
- Setel DataScale ke
2
- Klik
OK
Seret dan lepas Data Flow task
ke Alur Kontrol tab dan beri nama sebagai File to database - With Cedilla delimiter
. Nonaktifkan tugas aliran data pertama.
Konfigurasikan tugas aliran data kedua dengan Flat File Source
dan OLE DB Destination
Klik dua kali Flat File Source untuk membuka Flat File Source Editor
. Di Connection Managers
halaman Editor Sumber File Datar , pilih Pengelola Koneksi File Datar ProductListPrice_Cedilla
dan klik Kolom halaman untuk mengkonfigurasi kolom. Klik OK
.
Jalankan paket. Semua komponen akan menampilkan warna hijau untuk menunjukkan bahwa proses berhasil tetapi tidak ada baris yang akan diproses. Anda dapat melihat bahwa tidak ada indikasi nomor baris di antara Flat File Source
dan OLE DB Destination
Klik Progress
tab dan Anda akan melihat pesan peringatan berikut.
[Read flat file [1]] Warning: The end of the data file was reached while
reading header rows. Make sure the header row delimiter and the number of
header rows to skip are correct.