我正在使用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我明白,一個參數可以是任何地方文本值可以
我想你應該看看準備好的陳述。你正在使用哪種RDMS? SQL服務器? MySQL的? – Barranka 2013-04-22 20:56:53
*「因爲這些字段在SQL語句的SELECT部分中,所以無法對它們進行參數化。」*爲什麼?如果爲列添加「AS」別名會怎樣? – cdhowie 2013-04-22 20:56:55
@cdhowie,他提供了列的價值,名稱是不重要的。 – 2013-04-22 21:01:57