调用SqlParameter.Add/AddWithValue后获取生成SQL命令的方法咨询
可行实现方案
方案1:参数化批量插入(最推荐,无SQL注入风险,无需手动处理转义)
不要手动拼接SQL字符串,直接按分组生成参数化INSERT命令,每10条为一批执行,既解决单引号转义问题,也能保证执行效率:
const int BatchSize = 10; // 假设你的数据集合为 List<Bina> binaList for (int i = 0; i < binaList.Count; i += BatchSize) { var currentBatch = binaList.Skip(i).Take(BatchSize).ToList(); using var cmd = new SqlCommand(); var valueSegments = new List<string>(); int paramSuffix = 0; foreach (var bina in currentBatch) { // 每个参数加唯一后缀避免重复 valueSegments.Add($"(@KurumKodu{paramSuffix},@KurumAdi{paramSuffix},@mahKodu{paramSuffix},@ParselID{paramSuffix},@AdaNo{paramSuffix},@ParselNo{paramSuffix},@ATZeminID{paramSuffix},@BagimsizBolumZeminRef{paramSuffix},@BagimsizBolumNo{paramSuffix},@Blok{paramSuffix},@Kat{paramSuffix},@BelgeID{paramSuffix},@BelgeTarih{paramSuffix},@BelgeSayi{paramSuffix},@BelgeKonu{paramSuffix},@BelgeAciklama{paramSuffix},@BelgeTipRef{paramSuffix},@BelgeTipAdi{paramSuffix},@DosyaAdi{paramSuffix},@durum{paramSuffix})"); // 批量添加参数,空值自动转DBNull cmd.Parameters.AddWithValue($"@KurumKodu{paramSuffix}", bina.KurumKodu); cmd.Parameters.AddWithValue($"@KurumAdi{paramSuffix}", bina.KurumAdi ?? DBNull.Value); // 剩余所有字段按照上面的规则依次添加即可 cmd.Parameters.AddWithValue($"@durum{paramSuffix}", (int)durum); paramSuffix++; } // 拼接完整SQL命令 cmd.CommandText = $"INSERT INTO 你的表名 (KurumKodu,KurumAdi,mahKodu,ParselID,AdaNo,ParselNo,ATZeminID,BagimsizBolumZeminRef,BagimsizBolumNo,Blok,Kat,BelgeID,BelgeTarih,BelgeSayi,BelgeKonu,BelgeAciklama,BelgeTipRef,BelgeTipAdi,DosyaAdi,durum) VALUES {string.Join(",", valueSegments)}"; cmd.Connection = 你的数据库连接对象; // 执行当前批次 cmd.ExecuteNonQuery(); }
方案2:封装扩展方法实现你期望的GetCommand()逻辑
如果你需要直接拿到拼接完成的完整SQL(比如导出离线执行脚本),可以自行封装扩展方法,自动处理转义、类型适配逻辑,不需要每次手动写Replace:
第一步:编写扩展方法
public static class SqlCommandExtension { public static string GetGeneratedSql(this SqlCommand cmd) { string resultSql = cmd.CommandText; foreach (SqlParameter param in cmd.Parameters) { string valueFormat; switch (param.SqlDbType) { // 字符串、日期类型自动加单引号、转义内部单引号 case SqlDbType.VarChar: case SqlDbType.NVarChar: case SqlDbType.Text: case SqlDbType.DateTime: case SqlDbType.Date: if (param.Value == DBNull.Value || param.Value == null) { valueFormat = "NULL"; } else { valueFormat = $"'{param.Value.ToString().Replace("'", "''")}'"; } break; // 数值、布尔类型不需要加单引号 case SqlDbType.Int: case SqlDbType.BigInt: case SqlDbType.Decimal: case SqlDbType.Bit: valueFormat = param.Value == DBNull.Value || param.Value == null ? "NULL" : param.Value.ToString(); break; default: valueFormat = param.Value.ToString(); break; } resultSql = resultSql.Replace(param.ParameterName, valueFormat); } return resultSql; } }
第二步:按你期望的方式调用
var cmd = new SqlCommand(); // 定义单条数据的SQL模板 cmd.CommandText = "(@KurumKodu,@KurumAdi,@mahKodu,@ParselID,@AdaNo,@ParselNo,@ATZeminID,@BagimsizBolumZeminRef,@BagimsizBolumNo,@Blok,@Kat,@BelgeID,@BelgeTarih,@BelgeSayi,@BelgeKonu,@BelgeAciklama,@BelgeTipRef,@BelgeTipAdi,@DosyaAdi,@durum)"; // 添加参数 cmd.Parameters.AddWithValue("@KurumKodu", bina.KurumKodu); cmd.Parameters.AddWithValue("@KurumAdi", bina.KurumAdi); // 剩余参数依次添加完成后调用扩展方法 string singleValueSql = cmd.GetGeneratedSql(); _csvalueslist += singleValueSql;
额外优化建议
如果单批次处理的数据量超过1000条,更推荐使用SqlBulkCopy类实现批量插入,执行效率比批量INSERT高3~10倍,只需要将你的数据集合转为DataTable后调用WriteToServer方法即可。
内容的提问来源于stack exchange,提问作者Alper Tarik
相关产品推荐
相关产品推荐

