2012-07-11 88 views
-2

我一直工作在C#中的項目,這在某些時候我需要在那裏他們的文件名是相同的,以比較兩個字符串,SQL代碼在C#中比較屬性

SELECT Hash 
FROM Beamer.PackageDetailFile (NOLOCK) 
WHERE FileName = '"+fileName+"' ; 

這不是工作,桌子和列名是正確的。但是,

SELECT Hash FROM Beamer.PackageDetailFile (NOLOCK) 

此代碼給我哈希。

有什麼問題?請幫忙謝謝。

問題解決了,fileName即時調用是目錄路徑而不是文件名,這就是問題所在。正常工作,現在歡呼所有

+6

看看您的鍵盤。有一個密鑰輸入。嘗試一下。有時非常有用。 – 2012-07-11 07:19:45

+0

我在iphone上鍵入sory ... – tipi 2012-07-11 07:22:58

+4

當你說不工作你是什麼意思?這是否會給出錯誤消息還是查詢返回空?通過加入一個字符串變量,在c#中創建sql語句也是一個非常糟糕的主意。它會讓你的代碼面臨注入攻擊。養成使用存儲過程或參數化查詢的習慣是一種好習慣。 – Purplegoldfish 2012-07-11 07:24:55

回答

0

查詢本身應該被罰款,雖然這是非常不好的做法,而應該使用的參數,即

WHERE FileName = @filename 

並使用本地變量的值向名爲filename的命令添加一個參數。

原因這可能失敗:

  • 大小寫;如果CS,然後'abc'不等於'AbC'(如果CI,它是
  • 填充,即[n]char(len) VS [n]varchar(len);一個[n]char(len)被填充與空白右側,這可以給奇結果
  • unicode的,即N'{blah}' VS '{blah}' - 主要是僅適用於非ASCII的問題「嗒嗒」
  • 長度切邊;如果列爲[n]varchar(20),而且您的參數長度爲80個字符,則它將不匹配列中的修剪版本
+0

感謝您的回答,我正在處理可能的錯誤。 – tipi 2012-07-11 07:46:08

1

正如人們所說,避免在C#中創建SQL語句。但是,如果你堅持,請檢查以確保C#中的'fileName'變量不是空的並且具有正確的值。

我遇到的另一個問題是SQL服務器中列的長度。例如,如果數據庫列是varchar(50),並且您的fileName超過50個字符,則比較將失敗(您會發現存儲在數據庫中的文件名被截斷)。在這種情況下,你應該改變你的數據庫列到一個更大的長度,或只是爲varchar(最大)

+0

感謝您的回答,但是這不是可能的錯誤,因爲文件名和列中的文件名大多相同,並且我也沒有授權編輯數據庫 – tipi 2012-07-11 07:36:47