gpt4 book ai didi

C# 动态 SQL INSERT ... SELECT

转载 作者:可可西里 更新时间:2023-11-01 07:22:52 24 4
gpt4 key购买 nike

我正在使用 INSERT ... SELECT 语法从表中选择现有行,然后插入到另一个表中。除了每一行的现有数据之外,我还需要添加 BillingID 和 TimeStamp。因为这些字段位于 SQL 语句的 SELECT 部分,所以我无法对它们进行参数化。我使用 SQL 函数 NOW() 解决了 TimeStamp 问题,但是我仍然留下了 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 注入(inject),因为这是一个按自动计划运行且没有任何用户交互的控制台应用程序。 (BillingID 是自动生成的)。尽管如此,我还是不喜欢使用连接字符串,因为它们可读性差。有更优雅的方法吗?

编辑:

总而言之,我认为既然你不能这样做:

SELECT @field FROM @table

我假设 SQL 语句的 SELECT 部分不允许使用参数。但是,因为我在 select 语句中指定了一个值而不是选择一个列,正如@cdhowie 指出的那样,我可以在那里使用一个参数。本质上,我翻译的查询是这样的:

SELECT 25 FROM table_name, not  SELECT field FROM table_name

现在多亏了@cdhowie,我明白参数可以是文字值可以是的任何地方

最佳答案

假设查询参数的类型正确(例如,... LIMIT @Foo 只要绑定(bind)整数,查询参数在任何地方都是有效的-- 或者 SQL 服务器可以成功转换为整数的东西 -- 到 Foo 参数)。当然,这假定您使用的 SQL 方言没有特别的怪癖。

换句话说,没有理由不能使用查询参数传递 BillingID

关于C# 动态 SQL INSERT ... SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com