2012-04-19 77 views
4

我需要發送一個命令到數據庫。我知道受影響表中所有字段的名稱和數據類型,我需要使用它們生成一個命令。我唯一的問題是確定哪些列值是需要在TSQL中引用的數據類型 - 例如,如果字段是varchar類型的字符串Hello World,我需要引用它,但如果它是int,5,I不需要引用它。確定哪些SQL數據類型需要引用值?

我可以使用類似下面的代碼,但它似乎效率很低。有人可以指點我一個更好的方式來做到這一點 - 可能使用內置的SQL服務器或C#功能?

public string QuoteStringIfDatatypeRequires(string columnName) 
{ 
    if (DataTypes[columnName].Contains("date") || DataTypes[columnName].Contains("time") || 
     DataTypes[columnName].Contains("char") || DataTypes[columnName].Contains("text") || 
     DataTypes[columnName].Contains("binary") || DataTypes[columnName].Contains("image")) 
    { 
     return "'" + columnName + "'"; 
    } 

    return columnName; 
} 
+11

這只是一個等待發生的SQL注入事故。你有沒有想過使用** [參數化查詢](http://blogs.msdn.com/b/sqlphp/archive/2008/09/30/how-and-why-to-use-parameterized-queries.aspx) **而不是? – 2012-04-19 19:38:26

+0

什麼代表'columnName'?您想要插入表中的值還是列的名稱?真的,我不明白你想做什麼。 – Steve 2012-04-19 19:43:34

+0

我查看了參數化查詢,它會起作用。我對C#不熟悉,所以我不知道我在問什麼。當定時器用完時我會接受這個答案。 – 2012-04-19 19:46:13

回答

5

您可以引用所有內容,並且數據庫本身會將其轉換爲適當的數據類型。

但這樣會不正確。相反,你需要使用參數化查詢和發送值是:

command.Parameters.AddWithValue("@name", value); 

command.Parameters.Add("@name", type, size).Value = value; 

MSDN