none
請問有關sql語法與搜尋檔案名稱 RRS feed

  • 問題

  • 我的資料庫中有二個欄位一個是date, 另一個是device,如何下select可以「如果date欄位是有資料的話,就在c:\test看是否有檔案名稱為device欄位裡的檔案名稱」例如:資料庫中

    device      date

    123             2006/11/01<<--------------找到有key日期

    456           2006/10/10<<-------------找到有key日期

    789         

    會到c:\test底下搜尋是否有123.xls與456.xls

    請問我該怎麼寫slect與檔案搜尋的部份呢?

    2006年11月14日 上午 07:30

解答

  • 你應該要用一些方法記錄下之前找到的檔案記錄 .
    例如 ArrayList.

    我用 C# 的寫法如下(請自行翻譯成 VB code):

    ArrayList list = new ArrayList();

    while (dr.Read())
    {
        FileInfo[] fileInfoList = DirectoryInfo.GetFiles(dr.GetValue(dr.GetOrdinal("device")).ToString());
       
       
    if (fileInfoList == null || fileInfoList.Length == 0)
        {
            // file not found.
        }
        else
        {
           
    list.Add(dr.GetValue(dr.GetOrdinal("device")).ToString());
        }   
    }

    // read list to get all found file names.

    你會問 DirectoryInfo.GetFiles(filename) 如何加入 dr("device"),老實說我很訝異,那我問你,dr("device") 是什麼?filename 是字串,代表檔案的名稱,如果這樣提示你還不會做,那 ...

    2006年11月15日 上午 03:24
    版主

所有回覆

  • SQL 不是萬能的,它只能針對資料庫作業 .
    雖然 SQL Server 有像是 xp_cmdshell 或是 sp_OACreate 這類的預存程序可以呼叫外部程式,但,這會有安全性問題 .
    你把這兩個作業分開來處理就可以了 .

    2006年11月14日 上午 07:40
    版主
  • 我想出來了,但....遇到了比對的問題><"以下是我寫比對的程式:


            For Each dr In mydatatable.Rows
                     For Each file1 In dir1.GetFiles

                    If file1.Name <> dr("device")  Then 
               messagebox.show("not find!!")         

                    End If
                Next
            Next

    但它會是一筆一筆的去比對,例如資料庫中有1與2而路徑裡有1與3,它會是1--->1,1---->3,2---->1,2--->3的情況,但如果像1--->1它是找的到,因此不會show message但1--->3時,它就會show 找不到的message><"但我想要的是全部比對完後再show出有哪些是路徑裡面沒有的,像此例比對完後show出2路徑裡沒有的!!

    2006年11月15日 上午 02:06
  • 1. 看不懂你要表達的是什麼 ...

    1--->1 是指什麼? 1---> 3 又是指什麼 ?

    我試著解譯你的說法:

    "2006/10/10", "File1010.txt" (matched)
    "2006/10/11", "File1011.txt" (matched)

                            , "File1012.txt"

    所以你要確定路徑下有沒有 "File1010.txt" 和 "File1011.txt" 兩個檔案,這是你最前面的說法 .
    如果不是,煩請你說明清楚一點 .

    2. 檔案搜尋用指定檔名方式不是比較快嗎:
    DirectoryInfo.GetFiles(filename)
    DirectoryInfo.GetFiles(filename, SearchOption.AllDirectories) 就可以連子目錄一起搜尋 .

    2006年11月15日 上午 02:34
    版主
  • "2006/10/10", "File1010.txt" (matched)
    "2006/10/11", "File1011.txt" (matched)

                            , "File1012.txt"

    所以你要確定路徑下有沒有 "File1010.txt" 和 "File1011.txt" 兩個檔案

    沒錯!!我的意思是這樣,但我寫的迴圈會是如果路徑中有File1010.txt與3.xls的話,我以中斷點去做查詢的話,會是File1010.txt比對File1010.txtFile1010.txt比對File1011.txt但3.xls比對File1010.txt時也會show出找不到的message,但明明剛剛比對過是有找到File1010.txt這一個檔案名稱的!!我現在是不太明白我的迴圈應該如何修改若File1010.txt比對File1010.txt-->找到!!就表示是ok的,即使3.xls比對File1010.txt-->是找不到!!也不會show出找不到的訊息。我知道我的迴圈有問題,但...請問該如何修改呢?另外您說DirectoryInfo.GetFiles(filename)<<--請問我該如何加入dr("device")(因為是依select後的欄位內容做路徑搜尋)

    2006年11月15日 上午 03:08
  • 你應該要用一些方法記錄下之前找到的檔案記錄 .
    例如 ArrayList.

    我用 C# 的寫法如下(請自行翻譯成 VB code):

    ArrayList list = new ArrayList();

    while (dr.Read())
    {
        FileInfo[] fileInfoList = DirectoryInfo.GetFiles(dr.GetValue(dr.GetOrdinal("device")).ToString());
       
       
    if (fileInfoList == null || fileInfoList.Length == 0)
        {
            // file not found.
        }
        else
        {
           
    list.Add(dr.GetValue(dr.GetOrdinal("device")).ToString());
        }   
    }

    // read list to get all found file names.

    你會問 DirectoryInfo.GetFiles(filename) 如何加入 dr("device"),老實說我很訝異,那我問你,dr("device") 是什麼?filename 是字串,代表檔案的名稱,如果這樣提示你還不會做,那 ...

    2006年11月15日 上午 03:24
    版主