none
使用SqlDataReader 为什么会锁表,而且产生了近2万个锁,导致表锁死,无法对表的修改程序 RRS feed

  • 问题

  • 查询语句
    select  a.reg_id,a.service_nbr,a.vouchers_code,a.vouchers_price,convert(char(10),a.voucher_eff_date,20),convert(char(10),a.voucher_exp_date,20) ,a.voucher_install_employee,a.voucher_accpet_employee,a.voucher_install_site_id,a.voucher_accept_site_id,a.install_order_id,a.accept_order_id,a.voucher_status,a.prd_inst_id,a.prd_inst_name,a.ofr_id,a.ofr_name,a.ofr_type,a.ofr_status,a.ofr_inst_id,a.ofr_group_name,a.ofr_grade_value,a.diff_machine_price_pay_fee,a.stored_fee,a.real_pay_fee,a.crm_dev_code,crm_dev_name,a.crm_dev_dept_name,a.dev_employee,a.dev_site_id,a.dev_contact_tel,a.vpn_group_code,a.vpn_group_name,a.crm_mkt_res_name,a.crm_res_inst_nbr,a.mkt_res_name,a.res_inst_nbr,a.pre_rule_name,a.pre_rule_id,a.beyond_crm_pre_rule_name,a.beyond_crm_pre_rule_id,a.machine_recycling_type,a.uim_card_number,a.register_site_id,a.channel_type_id,c.machine_type,a.reimburs_id,a.voucher_used_site_id,a.reason,convert(char(10),a.terminal_receive_date,20),a.local_company_direct_pay,a.retail_guide_price,a.retail_pay,a.electronic_channels_pay,a.direct_sale_department,a.terminal_receive_date,a.reg_type,a.special_direct_pay,a.ofr_order_id,a.ofr_order_create_date,a.crm_stored_fee,a.crm_serial_install_date,a.should_diff_machine_price_pay_fee,d.PRE_RULE_TYPE_ID,a.last_main_order_id,a.market_center_id,a.last_main_order_date,a.pay_according_date,a.prd_inst_desc  from terminal_vouchers_registration a left join terminal_models_combine c on a.crm_mkt_res_name=c.machine_model left join  tb_bil_pre_rule d on a.pre_rule_id=d.pre_rule_id where a.reg_type='直销' and a.status in(2,201,3) and a.register_date>='2011-07-25' and a.register_date<='2012-07-25 23:59:59'  and a.area='551' and a.subarea='0' and a.direct_sale_department='60361229'

    执行

       using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(queryString, connection);
                    connection.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    if (!reader.HasRows)
                        break;
                    while (reader.Read())
                    {
                        j++;
                        v_machine_type = "";
                        //v_distribute_fee = 0;
                        v_distribute_fee_involve = "";
                        v_local_company_direct_pay = "null";

    2012年7月26日 1:15

答案

  • 给出个人的建议

    1.SQL连接的表太多,可能表的数据量大,导致查询速度慢,优化SQL

    2.查询的时候可以使用锁,在表名称后面加上NOLOCK标识

    2.使用完SqlDataReader 后,要记得关闭


    http://blog.csdn.net/zx13525079024

    2012年7月26日 1:47

全部回复

  •   if (!reader.HasRows)
                        break;

    你这个代码有意义么?

    datareader是长连接,在读取数据的时候会一直保持与数据库的连接。仔细看看BOL说明吧。


    family as water

    2012年7月26日 1:27
  • 给出个人的建议

    1.SQL连接的表太多,可能表的数据量大,导致查询速度慢,优化SQL

    2.查询的时候可以使用锁,在表名称后面加上NOLOCK标识

    2.使用完SqlDataReader 后,要记得关闭


    http://blog.csdn.net/zx13525079024

    2012年7月26日 1:47