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我明白了参数可以在任何地方文字值可以在

c#动态SQL INSERT选择

查询参数在任何地方都是有效的,假设查询参数是正确的类型(例如... 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);

你可以用更简洁的代码来参数化你的查询。

好运