2012-12-04 53 views
0

我在寫一個小程序,它將csv文件轉換爲一系列insert語句插入到數據庫中。該程序不瞭解數據庫,因此所寫的語句是一次性的,它們不能是動態的。在c#中生成sql語句 - 將tabe值插入到新表中

現在,每個數據集都有自己的GUID,我想有語句查詢數據庫,以確定是否存在數據集的基礎上,它的名字。所以,我有:

sw.WriteLine("-- Determine if dataset exists from school name"); 
sw.WriteLine(string.Format(
"INSERT INTO DataSets (Guid, DataSets) VALUES ('{0}', '{1}') WHERE NOT EXISTS (SELECT * FROM DataSets WHERE DataSetName = '{1}')", 
Guid, 
DataSetName 
)); 

(請糾正我,如果我錯了,真的SQL是不是我的專長) 現在,下一個問題是,對於數據集的GUID在一些其他表的使用,如:

string sql = string.Format(
        "INSERT INTO Table1 VALUES ('{0}', '{1}', '{2}', {3}, '{4}');", 
        object.value1 
        object.value1 
        object.value1 
        object.value1 
        Guid 

「的Guid」不能雖然用作在c#一個變量,它可以是一個新的GUID(如果「數據集」在數據庫中不存在)或現有的GUID(如果「數據集的存在,讓現有的GUID)

所以我需要這樣的東西:

string sql = string.Format(
        "INSERT INTO Table1 (Data1, Data2, Data3, Data4) VALUES ('{0}', '{1}', '{2}', {3});", 
        object.value1 
        object.value1 
        object.value1 
        object.value1 
string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}'); 
        Guid 
        ); 

這是一個很好的(甚至是有效的?)這種方式嗎?

+0

您有SQL注入漏洞。 – SLaks

+0

我有一個函數可以在插入數據之前用''替換任何逗號。我仍在研究更多措施,但在運行此代碼之前應對數據進行消毒。 –

+2

您應該使用參數。 – SLaks

回答

2

首先,像其他人指出的那樣,你是開放的SQL注入,所以,對於SqlCommand的使用參數是一個更好的選擇。你可以找到很多例子。

但是,如果代碼僅僅是將CSV插入,這是真的不太可能有人會嘗試破解程序,我會說這是確定的。

bascially,你所描述的是好的。但

string sql2 = string.Format("INSERT INTO Table1 (Data5) VALUES (SELECT Guid FROM Datasets WHERE DataSetName = '{0}'); 
       Guid 
       ); 

你應該先檢查是否返回GUID或空

SELECT Guid FROM Datasets WHERE DataSetName = '{0}' 

然後再決定是否創建一個新的GUID並插入。

如果你只是一次做進口,你甚至不需要檢查GUID是否存在。你從代碼創建一個GUID,插入到SQL中。這是因爲它是guid,在一個批次中創建相同guid的可能性實際上非常小,但理論上它不是零。

  • 如果您不需要知道數據庫中的guid是什麼(即您只需要導入一次),則不必連接到數據庫。你可以使用你使用的所有guid列表。
+0

謝謝!我已經確保Guid不爲空,因爲我的第一個代碼塊將首先運行,如果它爲空,將創建一個新的guid。 我正在檢查guid是否存在,以便將新數據與任何現有數據進行匹配,因爲如果它們具有相同的名稱,我希望它們被相同的guid引用。 –

+0

不使用參數是因爲「真的不太可能有人會嘗試破解該程序」是非常危險的建議。養成使用它們的習慣,即使你「確定」它們沒有必要。 –

+0

好的,我正在研究使用參數。幾個問題:1.我可以不使用SqlConnection,因爲此程序無法訪問服務器。 2.如何讓命令對象寫入命令(不發送給服務器)? –