2016-08-21 22 views
0

我現在有一個方法來查看輸入是什麼類型的對象,並基於它創建一個SQL輸入,就像這樣:TYPEOF無法正常運轉的條件

private static string PropertyToDBString(object o) 
{ 
    Debug.Log(o.GetType()); 
    if (o == typeof(System.String) || o == typeof(string)) 
     return "'" + o.ToString() + "'"; 
    else if (o == typeof(System.Boolean) || o == typeof(bool)) 
     return ((System.Boolean)o) ? "1" : "0"; 

    return "'" + o.ToString() + "'"; 
} 

但這似乎並沒有工作,一切以.toString()爲基礎返回,布爾返回值爲True/False,但日誌正在拾取類型爲system.boolean。像這樣:

enter image description here

我使用SQLite的,不知道我是否應該打擾使用適當的數據類型,不存在限制,甚至是事實上的布爾列是INT(1)數據庫,但仍然存儲真/假。我應該只使用TEXT處理所有事情。

+1

我還沒有做C#一段時間,但'o == typeof'看起來不正確。像'o.type == typeof'這樣的東西更有意義。請參閱http://stackoverflow.com/questions/983030/type-checking-typeof-gettype-or-is – John3136

+0

如果您的問題已得到滿意答覆,請選擇一個答案來關閉此問題。謝謝! –

回答

2

我現在有一個方法來查看輸入是什麼類型的對象,並創建一個基於它

不要做一個輸入的SQL語句。改爲使用參數化的SQL。你應該而不是試圖格式化你的值在SQL中使用。這幾乎是總是將成爲SQL注入攻擊的途徑。現在

,對於問題本身...你正在檢查自身是否otypeof(bool) - 而我懷疑你要檢查o.GetType()是否typeof(bool)

更重要的是,使用is操作:

if (o is string) 
{ 
    return "'" + o + "'"; 
} 
if (o is bool) 
{ 
    bool value = (bool) o; 
    return value ? "1" : "0"; 
} 
// Are you sure you want this? I would throw an exception if you 
// don't know what to do with the value... 
return "'" + o + "'"; 
+0

@TristanCunningham:這是非常非常不清楚你想做什麼 - 但正如我所說的,你不應該試圖格式化SQL參數。我建議你考慮創建一個新的問題,它提供了關於你如何使用它的更多細節,所以我們可以幫助你正確地使用SQL參數。 –

2

如果你用你的SQL參數,你不必擔心數據類型或單引號。

代替

對於插入,:

com.CommandText = "Insert into MyTable (ID,Name,Birthday,Age) values (12,'Bob','01/01/1980',24)"; 

你這樣做:

com.CommandText = "Insert into MyTable (ID,Name,Birthday,Age) values (@ID,@Name,@BD,@Age)"; 
    int ID = 12; 
    string Name = "Bob"; 
    DateTime Birthday = new DateTime(1980, 1, 1, 0, 0, 0); 
    Int Age = 24; 
    com.Parameters.AddWithValue("@ID", ID); 
    com.Parameters.AddWithValue("@Name", Name); 
    com.Parameters.AddWthValue("@BD", Birthday); 
    com.Parameters.AddWithValue("@Age", Age); 

爲布爾輸入,你可以這樣做:

bool isTrue = true; 
    com.Parameters.AddWithValue("@isHappyCustomer",isTrue ? 1 : 0); 

當使用參數,你不不需要使用與數據庫中相同的數據類型 - 只要值本身將匹配數據庫字段的要求即可。所以,你可以一個字符串發送到日期像

com.Parameters.AddWithValue("@date","1/1/2016"); 

的日期字段,或

com.Parameters.AddWithValue("@age","24"); 

一個整型字段。儘管使用相同的數據類型並不依賴於此轉換功能IMO始終是個好主意。