参数化查询与拼接SQL代码执行测试
环境:xp(sp3),vs2010,sql2005,
代码:

public partial class Form1 : Form { private string ConnString = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); sw.Start(); using (SqlConnection conn = new SqlConnection(ConnString)) { conn.Open(); string cmdText = @"Insert Into ScanStatus(LblSn,Status,Msg,AddTime) Values(@LblSn,@Status,@Msg,@AddTime)"; SqlCommand cmd = new SqlCommand(cmdText, conn); cmd.Parameters.AddRange(new SqlParameter[]{new SqlParameter("@LblSn", SqlDbType.NVarChar,20), new SqlParameter("@Status", SqlDbType.NVarChar,20), new SqlParameter("@Msg", SqlDbType.NVarChar,100), new SqlParameter("@AddTime", SqlDbType.DateTime,8)}); cmd.Prepare(); for (int i = 0; i < 500; i++) { cmd.Parameters["@LblSn"].Value = "123" + i; cmd.Parameters["@Status"].Value = ""; cmd.Parameters["@Msg"].Value = string.Empty; cmd.Parameters["@AddTime"].Value = DateTime.Now; cmd.ExecuteNonQuery(); } } sw.Stop(); label1.Text = sw.ElapsedMilliseconds.ToString(); MessageBox.Show("OK!"); } private void button2_Click(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); sw.Start(); using (SqlConnection conn = new SqlConnection(ConnString)) { conn.Open(); string cmdText = @"Insert Into ScanStatus(LblSn,Status,Msg,AddTime) Values(@LblSn,@Status,@Msg,@AddTime)"; SqlCommand cmd = new SqlCommand(cmdText, conn); cmd.Parameters.AddRange(new SqlParameter[]{new SqlParameter("@LblSn", SqlDbType.NVarChar), new SqlParameter("@Status", SqlDbType.NVarChar), new SqlParameter("@Msg", SqlDbType.NVarChar), new SqlParameter("@AddTime", SqlDbType.DateTime)}); for (int i = 0; i < 500; i++) { cmd.Parameters["@LblSn"].Value = "123" + i; cmd.Parameters["@Status"].Value = ""; cmd.Parameters["@Msg"].Value = string.Empty; cmd.Parameters["@AddTime"].Value = DateTime.Now; cmd.ExecuteNonQuery(); } } sw.Stop(); label2.Text = sw.ElapsedMilliseconds.ToString(); MessageBox.Show("OK!"); } private void button3_Click(object sender, EventArgs e) { Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 500; i++) { using (SqlConnection conn = new SqlConnection(ConnString)) { conn.Open(); string cmdText = @"Insert Into ScanStatus(LblSn,Status,Msg,AddTime) Values('{0}','{1}','{2}','{3}')"; cmdText=string.Format(cmdText,"123" + i,"","",DateTime.Now); SqlCommand cmd = new SqlCommand(cmdText, conn); cmd.ExecuteNonQuery(); } } sw.Stop(); label3.Text = sw.ElapsedMilliseconds.ToString(); MessageBox.Show("OK!"); } }
结论:3种写法没多少区别Prepare快个1%左右,基本可以忽略,默认情况下ado.net使用连接池
测试二,wince,vs2005, sql server compact3.1
代码类似上面
结果:使用同一个连接执行多个命令语句性能要比每次打开关闭速度快一个数量级,原因是没连接池存在
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述