我使用INSERT … SELECT语法从表中选择现有行,然后插入到另一个表中.除了每行的现有数据外,我还需要添加BillingID和TimeStamp.因为这些字段位于SQL语句的SELECT部分??,所以我无法对它们进行参数化.我使用SQL函数NOW(...

我使用INSERT … SELECT语法从表中选择现有行,然后插入到另一个表中.除了每行的现有数据外,我还需要添加BillingID和TimeStamp.因为这些字段位于SQL语句的SELECT部分??,所以我无法对它们进行参数化.我使用SQL函数NOW()解决了TimeStamp问题,但是我仍然使用BillingID,我通过sting concatenation添加到查询中,如下所示:
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.
本文标题为:C#动态SQL INSERT … SELECT


基础教程推荐
- C# Winform选项卡集成窗体详解 2022-11-18
- C#中缓存的基本使用方法 2022-12-31
- Unity3D实现待机状态图片循环淡入淡出 2023-02-15
- C#实现QQ截图功能及相关问题 2022-11-22
- C# 关于爬取网站数据遇到csrf-token的分析与解决 2023-03-29
- C#实现简单的计算器功能(窗体) 2023-05-16
- c# – app.UseDeveloperExceptionPage()似乎不适用于Ubuntu上的ASP .NET Core 2023-09-26
- Path类 操作文件类的实例 2022-11-27
- Unity实现通用的信息提示框 2023-03-03
- C# WPF ListView控件的实例详解 2022-11-18