2012-03-04 114 views
1

我想通過指定要查找的關鍵字來讓用戶搜索數據庫中的行。有幾個字段我想查找這個關鍵字,其中之一是唯一標識符。問題是,如果關鍵字是不是一個GUID,我得到了以下錯誤消息:關鍵字搜索包含Uniqueidentifier字段

Conversion failed when converting from a character string to uniqueidentifier 

我使用運行搜索的SQL看起來是這樣的:

// do not use 
string sql = @"SELECT * 
       FROM [MyTable] 
       WHERE [MyTable].[TableID] = '" + keyword + "'"; 

警告:這只是示例代碼 - 請勿像這樣編寫sql命令,因爲它會產生安全風險

如何編寫我的SQL select語句,使其在keyword不是GUID時不會失敗?

+0

+1爲安全警告 – Colin 2012-03-04 02:34:37

+0

爲什麼在運行查詢之前不簡單檢查'keyword'是否是有效的GUID *?你可以使用一個正則表達式,比如'@「^ [0-9A-F] {8} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {4} - [0-9A-F] {12} $「'。 – ruakh 2012-03-04 02:50:53

回答

2
string sql; 
    Guid id; 
    if (Guid.TryParse(keyword, out id)) 
    { 
     sql = @"SELECT *  
      FROM [MyTable]  
      WHERE [MyTable].[TableID] = '" + keyword + "'";  
    } 
    else 
    { 
     sql = //search by other way 
    } 
1

這是否適合您?

string sql = @"SELECT * 
       FROM [MyTable] 
       WHERE convert(varchar,[MyTable].[TableID]) = '" + keyword + "'"; 
0

我知道這並不能幫助你今天,但可能有助於未來的讀者。在SQL Server 2012中,你將能夠使用TRY_CONVERT

string sql = @"SELECT * 
    FROM dbo.[MyTable] 
    WHERE [TableID] = TRY_CONVERT(UNIQUEIDENTIFIER, '" + keyword + "');"; 

但是你真正應該做的是傳遞參數作爲一個強類型的GUID,以及處理錯誤的客戶端程序(使用try/catch)當有人輸入不是GUID的內容。