2015-04-26 17 views
0

C#模型不支持sql查詢在數據庫中,我的user_details表具有「UserId(varchar 255)」。我的模型如下:因爲GUID

public Guid UserId { get; set; } 
    public string Email { get; set; } 
    public string Gender { get; set; } 

問題是當我通過UserId查詢它,我得到無效的轉換異常關於字符串guid轉換。 下面是該查詢:

SELECT * FROM UserDetails WHERE UserId = '" + new Guid(userId.ToString()) +  "'" 
+2

使用參數,您將從sql-server獲得更好的性能。 –

+0

userId的價值是什麼?如果你得到一個轉換異常,.NET會說它不是一個GUID – dman2306

回答

0

我發現數據庫表聲明上的異常問題。正如我提到的問題,我的數據庫表UserId字段是varchar,這是導致問題當我將其更改爲uniqueidentifier,它聲明工作。

-3

你必須使用這樣的:

SELECT * FROM UserDetails WHERE UserId = '" + Giud.UserId + "'" 

,並選擇一個類型UserId..int例如

UPDATE

public Guid { 
    public static string UserId {get;set;} 
    public static string Email {get;set;} 
    public static string Gender {get;set;} 
} 

然後,例如,如果你有一個文本框,您要插入的文本將存儲在Guid.UserId中。比你更像上面所說的查詢。

+0

這裏'userId'是一個字符串。所以不工作。 – dmsbilas

+0

所以你想從數據庫中選擇'UserId'與你的表單中的'UserId'相等嗎? – dpaul1994

+0

好吧,你可以這樣使用。在2分鐘內我會更新我的答案。 – dpaul1994

-1

我認爲在你的表中你應該聲明[UserId]爲[Uniqueindetifier],它與GUID [全局唯一標識符]相同,並且在選擇查詢中,將唯一標識符作爲字符串發送,如下所示:

"SELECT * FROM UserDetails WHERE UserId = '" + UserId.ToString() + "'" 

或者

不要intance在查詢一個新的GUID對象,導致查詢只是一個簡單的字符串,你不能parce對象的查詢:

更改此:

"SELECT * FROM UserDetails WHERE UserId = '" + new Guid(userId.ToString()) + "'" 

對於這一點:

"SELECT * FROM UserDetails WHERE UserId = '" + userId.ToString() + "'" 
1

正如Scott提到的(並考慮沒有在執行該參數爲你的ORM提及),使用的參數,都爲更好的安全性和更好的性能。

var sql = "SELECT * FROM UserDetails WHERE UserId = @UserId"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand(sql, connection); 
    command.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier); 
    command.Parameters["@UserId"].Value = userId.ToString(); 

    // Execute query and return data 
} 

爲了完整起見,如果你只是想你的用戶標識符直列轉換(類似你現在在做什麼),你可以使用以下命令:

"SELECT * FROM UserDetails WHERE UserId = '" + userId.ToString() + "'" 

不過,我強烈反對它。在這種情況下,你有一個Guid類型,所以你應該從Sql Injection安全,但是編寫這樣的代碼將會幫助你形成不好的習慣,並且可能會在後續創建問題。我的第一個例子是推薦的方法。