遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

参数化查询与拼接SQL代码执行测试

环境:xp(sp3),vs2010,sql2005,
代码:

复制代码
View Code
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
代码类似上面
结果:使用同一个连接执行多个命令语句性能要比每次打开关闭速度快一个数量级,原因是没连接池存在

 

posted on   遗忘海岸  阅读(295)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示