2014-03-19 45 views
0

我有一個文件夾,這個文件夾裏面我有這個文件名的單個文件:特殊字符,MS SQL Server 2012,ASP和SQL?

male♂.txt 

我希望把這個文件名到我的SQL Server中使用ASP(VBScript)的2012數據庫:

<%@language=VBScript codepage=65001%><% 
Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Open "Provider=SQL Server Native Client 11.0;Server=localhost;Database=databank;Uid=myuser;Pwd=mypass;" 
Set RecSet = Server.CreateObject("ADODB.Recordset") 
Set FSO = CreateObject("Scripting.FileSystemObject") 

For Each file In FSO.GetFolder("C:\inputs\").files 
    RecSet.Open "SELECT * FROM filenames WHERE fname='"& file.name &"';", Conn, 0, 3 
     IF RecSet.EOF THEN 
      RecSet.AddNew 
       RecSet("fname") = file.name 
      RecSet.Update 
     end IF 
    RecSet.Close 
    RecSet.Open "SELECT * FROM filenames WHERE fname='"& file.name &"';", Conn, 0, 3 
     Response.Write "Is EOF: "& RecSet.EOF 
    RecSet.Close 
Next 
Conn.Close 
'setting variables to Nothing here 
%> 

當我運行這段代碼後,我使用MS SQL Management Studio檢查數據庫表,並且確實有一個帶有「male♂.txt」的文章。

問題是,ASP頁面輸出「Is EOF:True」,如果我再次運行相同的腳本,在數據庫中會創建另一個「male♂.txt」文章。

我最近從MS Access移到MS SQL Server 2012,上面的代碼按照MS Access(EOF爲false)的預期工作。我究竟做錯了什麼?

+1

想出來,需要在SQL中的字符串之前加N。會發布答案,但stackoverflow有一個遲緩的系統,新帳戶不能發佈答案,直到他們發佈問題後8小時。完全遲鈍。如果我記得的話,我會在幾個小時內回覆併發布答案。 – user3435078

+0

立即嘗試發佈您的答案 - 16個聲望應該足以消除「新用戶」的限制。 (其他SE網站沒有8小時的限制,但是,所以我可能是錯的。) – Martha

+1

用於構建此sql代碼的技術容易受到sql注入攻擊:( –

回答

2

好像你總是必須在MS SQL Server中的字符串之前添加「N」,以便它被讀爲Unicode。

如果我改變兩個SQL語句來此工作原理:

SELECT * FROM filenames WHERE fname=N'"& file.name &"'; 

我不知道這是必要的。它在MS Access中沒有N工作。

對於UPDATE和INSERT INTO也是如此,否則unicode字符將變成questionmarks。

+0

T-SQL中字符串開始之前的N前綴告訴SQL Server將該字符串視爲「NVARCHAR」,即「VARCHAR」的Unicode等效項。不要忘記將您的答案標記爲已接受(綠色勾號)。 – Lankymart

+0

並不意味着冒犯,但個人認爲這種反應不會有任何幫助。我相信這種延遲是爲了停止農業耕作,一旦你贏得了更多的代表,你就不會有這個問題。你可以隨時看[meta stackoverflow](http://meta.stackoverflow。com)獲取更多信息,甚至以建設性的方式作出貢獻。 – Lankymart