我使用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
- Unity实现跑马灯抽奖效果 2023-01-11
- C#图表算法之无向图 2023-06-04
- CentOS 7,安装Nginx 并发布netcore项目 2023-09-26
- 使用C# CefSharp Python采集某网站简历并且自动发送邀请短信的方法 2023-01-16
- C#使用NPOI库读写Excel文件 2023-05-22
- C#使用表达式树实现对象复制的示例代码 2023-05-12
- c# – 如何在Windows 7下“安装”/“启用”.Net 3.5 SP1? 2023-09-20
- C# 执行CMD命令并接收返回结果的操作方式 2023-04-14
- SQLServer批量插入数据的三种方式及性能对比 2023-05-11
- C# Winform选项卡集成窗体详解 2022-11-15