2013-04-22 51 views
4

我正在使用INSERT ... SELECT語法從表中選擇現有行並插入到另一個表中。除了每行的現有數據外,我還需要添加BillingID和TimeStamp。因爲這些字段在SQL語句的SELECT部分​​中,所以我無法對它們進行參數化。我解決了使用SQL函數NOW()時間戳的問題,但我仍然留下的BillingID我已經通過刺級聯添加到查詢,如下所示:C#動態SQL INSERT ... SELECT

static void UpdateMonthlyData(int BillingID, DateTime HistoryDate, int CompanyID) 
{ 
     String conString = ConfigurationManager.ConnectionStrings["xxx"].ConnectionString; 
     MySqlConnection connection = new MySqlConnection(conString); 

     String command = "INSERT INTO MonthlyData SELECT " + BillingID + ", d.*, NOW() " 
         + "FROM CurrentData d WHERE d.CompanyID = @CompanyID AND d.HistoryDate = @HistoryDate"; 

     MySqlCommand cmd = new MySqlCommand(command, connection); 
     cmd.Parameters.Add(new MySqlParameter("@CompanyID", CompanyID)); 
     cmd.Parameters.Add(new MySqlParameter("@HistoryDate", HistoryDate)); 

     cmd.CommandType = CommandType.Text; 

     cmd.Connection.Open(); 
     cmd.ExecuteNonQuery(); 
     cmd.Connection.Close();       
} 

我不關心SQL注入,因爲這是一個按自動時間表運行的控制檯應用程序,並且無論用戶如何交互。 (BillingID是自動生成的)。儘管如此,我不喜歡使用連接字符串,因爲它們不可讀。有沒有更好的方法來做到這一點?

編輯:

總結的東西了,我想,既然既然你不能做到這一點:

SELECT @field FROM @table 

我推測參數不是在SQL語句中的SELECT部分​​允許的。然而,因爲我在select語句中指定了一個值而不是選擇一列,所以@cdhowie指出我可以在那裏使用一個參數。從本質上說我的查詢翻譯是這樣的:

SELECT 25 FROM table_name, not SELECT field FROM table_name 

所以現在多虧@cdhowie我明白,一個參數可以是任何地方文本值可以

+0

我想你應該看看準備好的陳述。你正在使用哪種RDMS? SQL服務器? MySQL的? – Barranka 2013-04-22 20:56:53

+1

*「因爲這些字段在SQL語句的SELECT部分​​中,所以無法對它們進行參數化。」*爲什麼?如果爲列添加「AS」別名會怎樣? – cdhowie 2013-04-22 20:56:55

+2

@cdhowie,他提供了列的價值,名稱是不重要的。 – 2013-04-22 21:01:57

回答

3

的查詢參數是有效的任何地方,一個字面值會是這樣,假設查詢參數是正確的類型(如... LIMIT @Foo只要您綁定一個整數應該工作 - 什麼的SQL服務器可以成功轉換爲一個整數 - 到Foo參數)。當然,這並不假定你正在使用的SQL方言中有特殊的怪癖。

換句話說,沒有理由不應該使用查詢參數通過BillingID

2

您可以使用的String.Format任何安全領域無法通過參數添加:

String command = String.Format("INSERT INTO MonthlyData SELECT {0}, d.*, NOW() FROM CurrentData d WHERE d.CompanyID = @CompanyID AND d.HistoryDate = @HistoryDate", BillingID); 
2

可以使用的.Net string.format

示例:

string query = string.format{"insert into MonthlyData select {0} from CurrentData", 
            BillingId); 

您可以使用更簡潔的代碼更多地參數化您的查詢。

好運

+0

我會記住這種情況,當我不能paramtrize查詢,例如當我想要一個動態列或表名 – 2013-04-23 16:18:46

+0

儘管我使用cdhowies解決方案,當時我遇到的問題,我遇到了不同的情況今天(動態專欄名稱),您的答案完美適用於手頭的任務。謝謝。 – 2013-11-21 15:42:06