Saya relatif baru di C# (Mempelajari beberapa Java di sekolah, thouhh) jadi mohon maaf jika saya membuat beberapa kesalahan bodoh dalam kode saya. :)

Saya mengalami situasi aneh dalam tugas skrip saya yang termasuk dalam paket SSIS saya. Apa yang saya coba lakukan adalah secara rekursif mengulangi beberapa direktori lokal dan mendapatkan jalur dari setiap file Excel yang menyertakan beberapa string pola. Selanjutnya saya ingin menetapkan string ini ke Daftar, jadi saya bisa meneruskannya ke Variabel Pengguna SSIS.

Untuk menguji apakah saya mendapatkan string yang tepat, saya menulis baris ini:

MessageBox.Show(f);  //TEST

Berikut adalah contoh jalur:

L:\Wyciagi Bankowe\BZ WBK\2016\2016-01\wk01.16 01.01-05.01.2016\wk01 9329 _weekly.xls

Dan semuanya tampak berfungsi dengan baik ... sampai saya mencoba mengulangi daftar yang tampaknya kosong.

MessageBox.Show(list.Count.ToString());  // this returns 0
foreach (String item in list)
{
    MessageBox.Show(item);
}

Saya telah membaca stackoverflow dan beberapa dokumentasi MSDN dan semuanya tampak persis sama atau sangat mirip dengan contoh. Sooo ... Apa yang saya lakukan salah? :) Saya sudah mencoba menyelesaikan ini selama berjam-jam sekarang dan saya tidak punya ide lagi ...

Berikut skrip saya. Maaf telah menempelkan seluruh kode, tetapi saya tidak tahu bagian mana yang akan berguna. Jika Anda memiliki pertanyaan, beri tahu saya.

    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
    private String path; 
    private List<String> list;

    public void Main()
    {
        path =  Dts.Variables["Working_DIR"].Value.ToString();

        DirSearch(path);

        //TEST START
        MessageBox.Show(list.Count.ToString());  

        foreach (String item in list)
        {
            MessageBox.Show(item);
        }
        // TEST END

        Dts.Variables["File_List"].Value = list;

        Dts.TaskResult = (int)ScriptResults.Success;
    }

    void DirSearch(string sDir)
    {
        String searchPattern = "*9329*.xls";
        list = new List<String>();
        try
        {
            foreach (string d in Directory.GetDirectories(sDir))
            {
                if (d.Contains("2016") || d.Contains("2017") || d.Contains("2018") || d.Contains("2019"))
                {
                    foreach (string f in Directory.GetFiles(d, searchPattern))
                    {
                        MessageBox.Show(f);  //TEST
                        list.Add(f);
                    }
                    DirSearch(d);
                }
            }

        }

        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }
    }

    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };


}
1
Sławek 3 April 2019, 16:23

1 menjawab

Jawaban Terbaik

Masalahnya adalah dengan baris ini dalam metode DirSearch:

list = new List<String>();

Setiap kali Anda memanggilnya secara rekursif, itu mengatur daftar kembali ke daftar kosong. Opsi yang lebih baik adalah menginisialisasi daftar dari metode utama.

Jika Anda ingin mempertahankan daftar terpisah di dalam DirSearch, Anda dapat membuat variabel daftar lokal ke metode dan kemudian menambahkannya ke daftar tingkat kelas dengan menggunakan metode daftar AddRange.

2
njones57 3 April 2019, 13:30