c#动态SQL INSERT选择
本文关键字:选择 INSERT SQL 动态 | 更新日期: 2023-09-27 18:10:19
我正在使用INSERT…SELECT语法从表中选择现有行并将其插入到另一个表中。除了来自每行的现有数据外,我还需要添加BillingID和TimeStamp。因为这些字段位于SQL语句的SELECT部分,所以我不能对它们进行参数化。我使用SQL函数NOW()解决了时间戳问题,但是我仍然使用BillingID,我通过字符串连接将其添加到查询中,如下所示:
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我明白了参数可以在任何地方文字值可以在
查询参数在任何地方都是有效的,假设查询参数是正确的类型(例如... LIMIT @Foo
应该工作,只要你绑定一个整数-或SQL服务器可以成功转换为整数-到Foo参数)。当然,这假定您正在使用的SQL方言中没有特别的怪癖。
换句话说,没有理由不能使用查询参数传递BillingID
。
您可以使用String。不能通过参数化添加的安全字段的格式:
String command = String.Format("INSERT INTO MonthlyData SELECT {0}, d.*, NOW() FROM CurrentData d WHERE d.CompanyID = @CompanyID AND d.HistoryDate = @HistoryDate", BillingID);
可以使用。net字符串。格式的
示例:
string query = string.format{"insert into MonthlyData select {0} from CurrentData",
BillingId);
你可以用更简洁的代码来参数化你的查询。
好运