C#下批量判断该条记录在表中是否存在问题

如果一个数据表里边有几十条记录,而且你又没有做分区表的话,那么每次执行Insert操作之前如果都要Select Count(*) 后边加上条件的话,我想会是一场灾难。

之前我就是这么处理的。今天跟我们班的一个品学兼优的同学请教这个问题,他跟我说了一个办法,就是这样。

if exists (select * from tableName where conditions) select '1' else select '0'

打算晚上的时候写个Demo检测一下时间 试试看这个性能有没有什么提升,我会后续再更新博客!


昨晚的时候写了一个Demo试了一下这两个方案的效率方案A是传统的使用方法 方案B是别人给出的建议。

方案A:

if (Txt_WJLJ.Text.Trim() == "")
            {
                MessageBox.Show("文件路径不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                DateTime dt_Start = DateTime.Now;//开始时间
                SqlConnection conn = new SqlConnection("");
                try
                {
                    conn.Open();
                    DataSet ds_Data = ReturnDataset_CXDR(this.Txt_WJLJ.Text.Trim());
                    DataTable dt = ds_Data.Tables[0];
                    string str_QYDM = string.Empty;
                    string str_CBRQ = string.Empty;//抄表日期
                    string str_ZZBM = string.Empty;//住宅编码
                    string str_S1YQS = string.Empty;//上1月起数
                    string str_S1YZS = string.Empty;//上1月止数
                    string str_S1YCSDL = string.Empty;//上1月差数电量
                    string str_S2YQS = string.Empty;//上2月起数
                    string str_S2YZS = string.Empty;//上2月止数
                    string str_S2YCSDL = string.Empty;//上2月差数电量
                    string str_SYDL = string.Empty;//上月电量
                    string str_LJYDL = string.Empty;//累计用电量
                    string str_YHMC = string.Empty;
                    string str_YHDZ = string.Empty;//用户地址
                    this.Rtb_Log.Text += "[开始时间:]"+ DateTime.Now.ToString()+"\r\n";
                    //DateTime dt_Start = DateTime.Now;//开始时间
                    SqlCommand cmd_Query = new SqlCommand();
                    cmd_Query.Connection = conn;
                    string str_dt = string.Empty;
                    for (int i = 0; i < 250; i++)
                    {
                        str_YHDZ = dt.Rows[i][1].ToString().Trim();
                        str_QYDM = dt.Rows[i][0].ToString().Trim();
                        str_CBRQ = dt.Rows[i][3].ToString().Trim();
                        
                        str_ZZBM = dt.Rows[i][4].ToString().Trim();
                        str_S1YQS = dt.Rows[i][5].ToString().Trim();
                        str_S1YZS = dt.Rows[i][6].ToString().Trim();
                        str_S1YCSDL = dt.Rows[i][7].ToString().Trim();
                        str_S2YQS = dt.Rows[i][8].ToString().Trim();
                        str_S2YZS = dt.Rows[i][9].ToString().Trim();
                        str_S2YCSDL = dt.Rows[i][10].ToString().Trim();
                        str_SYDL = dt.Rows[i][11].ToString().Trim();
                        str_LJYDL = dt.Rows[i][12].ToString().Trim();
                        str_YHMC = dt.Rows[i][13].ToString().Trim();
                        if (str_CBRQ != "00/00/00  00:00" && IsDateTime(str_CBRQ)==true)
                        {
                            str_dt = Convert.ToDateTime(str_CBRQ).AddMonths(-1).ToString("yyyyMM");
                            cmd_Query.CommandText = "SELECT COUNT(*) FROM DLXXB WHERE MPH ='"+ str_YHDZ+"' AND QYDM = '"+ str_QYDM+"' AND convert(nvarchar(6),RQ,112)='"+str_dt +"'";
                            cmd_Query.ExecuteScalar();
                        }
                    }
                    DateTime dt_End = DateTime.Now;
                    System.TimeSpan ts = dt_End.Subtract(dt_Start);
                    this.Rtb_Log.Text += "[结束时间:]"+  DateTime.Now.ToString()+"\r\n累计耗时:"+ts.Minutes+"分钟" +ts.Seconds.ToString()+"秒";
                    MessageBox.Show("查询完成!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    return;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }
            }

方案B:

if (Txt_WJLJ.Text.Trim() == "")
            {
                MessageBox.Show("文件路径不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            else
            {
                SqlConnection conn = new SqlConnection("");
                try
                {
                    conn.Open();
                    DataSet ds_Data = ReturnDataset_CXDR(this.Txt_WJLJ.Text.Trim());
                    DataTable dt = ds_Data.Tables[0];
                    string str_QYDM = string.Empty;
                    string str_CBRQ = string.Empty;//抄表日期
                    string str_ZZBM = string.Empty;//住宅编码
                    string str_S1YQS = string.Empty;//上1月起数
                    string str_S1YZS = string.Empty;//上1月止数
                    string str_S1YCSDL = string.Empty;//上1月差数电量
                    string str_S2YQS = string.Empty;//上2月起数
                    string str_S2YZS = string.Empty;//上2月止数
                    string str_S2YCSDL = string.Empty;//上2月差数电量
                    string str_SYDL = string.Empty;//上月电量
                    string str_LJYDL = string.Empty;//累计用电量
                    string str_YHMC = string.Empty;
                    string str_YHDZ = string.Empty;//用户地址
                    this.Rtb_Log.Text += "[开始时间:]" + DateTime.Now.ToString() + "\r\n";
                    DateTime dt_Start = DateTime.Now;//开始时间
                    SqlCommand cmd_Query = new SqlCommand();
                    cmd_Query.Connection = conn;
                    string str_dt = string.Empty;
                    for (int i = 0; i < 250; i++)
                    {
                        str_YHDZ = dt.Rows[i][1].ToString().Trim();
                        str_QYDM = dt.Rows[i][0].ToString().Trim();
                        str_CBRQ = dt.Rows[i][3].ToString().Trim();
                        
                        str_ZZBM = dt.Rows[i][4].ToString().Trim();
                        str_S1YQS = dt.Rows[i][5].ToString().Trim();
                        str_S1YZS = dt.Rows[i][6].ToString().Trim();
                        str_S1YCSDL = dt.Rows[i][7].ToString().Trim();
                        str_S2YQS = dt.Rows[i][8].ToString().Trim();
                        str_S2YZS = dt.Rows[i][9].ToString().Trim();
                        str_S2YCSDL = dt.Rows[i][10].ToString().Trim();
                        str_SYDL = dt.Rows[i][11].ToString().Trim();
                        str_LJYDL = dt.Rows[i][12].ToString().Trim();
                        str_YHMC = dt.Rows[i][13].ToString().Trim();
                        if (str_CBRQ != "00/00/00  00:00" && IsDateTime(str_CBRQ)==true)
                        {
                            str_dt = Convert.ToDateTime(str_CBRQ).AddMonths(-1).ToString("yyyyMM");
                            //cmd_Query.CommandText = "SELECT COUNT(*) FROM DLXXB WHERE MPH ='"+ str_YHDZ+"' AND QYDM = '"+ str_QYDM+"' AND convert(nvarchar(6),RQ,112)='"+str_dt +"'";
                            cmd_Query.CommandText = "if exists (select * from DLXXB WHERE MPH ='" + str_YHDZ + "' AND QYDM = '" + str_QYDM + "' AND convert(nvarchar(6),RQ,112)='" + str_dt + "') select '1' else select '0'";
                            cmd_Query.ExecuteScalar();
                        }
                    }
                    DateTime dt_End = DateTime.Now;
                    System.TimeSpan ts = dt_End.Subtract(dt_Start);
                    this.Rtb_Log.Text += "[结束时间:]" + DateTime.Now.ToString() + "\r\n累计耗时:"+ts.Minutes+"分钟" + ts.Seconds.ToString()+"秒";
                    MessageBox.Show("查询完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }
            }

同样执行前250行:

行数:4339
[开始时间:]2016/6/17 8:11:57
[结束时间:]2016/6/17 8:12:39
累计耗时:0分钟42秒

[开始时间:]2016/6/17 8:12:48
[结束时间:]2016/6/17 8:13:31
累计耗时:0分钟43秒


感觉并没有什么显著的区别 还有更好的方法么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值