我使用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# – 列出Windows 8 / WinRT / XAML应用程序中的时区? 2023-09-18
- C#实现的简单整数四则运算计算器功能示例 2022-11-15
- C#通过抽象工厂模式造车 2023-07-05
- C#使用表达式树(LambdaExpression)动态更新类的属性值(示例代码) 2023-05-12
- C#实现常见加密算法的示例代码 2023-06-27
- C#二进制读写BinaryReader、BinaryWriter、BinaryFormatter 2023-06-14
- c# 在windows中操作IIS设置FTP服务器的示例 2023-04-09
- C# 实现特殊字符快速转码 2023-03-28
- CPF 使用C#的Native AOT 发布程序的详细过程 2023-05-26
- WPF如何绘制光滑连续贝塞尔曲线示例代码 2022-12-11