看我跟踪的Sql更新语句,Where后面为什么不是主键字段条件,而是所有条件?
这样效率岂不是很低?
EXEC sp_executesql N'UPDATE [bas_student] SET [s_Password] = @p1
WHERE (([s_ID] = @p2) AND ([s_LoginID] = @p3) AND ([s_Password] = @p4) AND ([s_Name] = @p5) AND ([s_Sex] = @p6) AND ((@p7 = 1 AND [s_Birthday] IS NULL) OR ([s_Birthday] = @p8)) AND ((@p9 = 1 AND [s_Tel] IS NULL) OR ([s_Tel] = @p10)) AND ((@p11 = 1 AND [s_Identity] IS NULL) OR ([s_Identity] = @p12)) AND ((@p13 = 1 AND [s_Address] IS NULL) OR ([s_Address] = @p14)) AND ((@p15 = 1 AND [s_Zip] IS NULL) OR ([s_Zip] = @p16)) AND ((@p17 = 1 AND [s_EMail] IS NULL) OR ([s_EMail] = @p18)) AND ((@p19 = 1 AND [s_SSchoolID] IS NULL) OR ([s_SSchoolID] = @p20)) AND ((@p21 = 1 AND [s_SSchool] IS NULL) OR ([s_SSchool] = @p22)) AND ([s_g_ID] = @p23) AND ((@p24 = 1 AND [s_g_Name] IS NULL) OR ([s_g_Name] = @p25)) AND ((@p26 = 1 AND [s_C_ID] IS NULL) OR ([s_C_ID] = @p27)) AND ((@p28 = 1 AND [s_C_Name] IS NULL) OR ([s_C_Name] = @p29)) AND ((@p30 = 1 AND [s_LengthTime] IS NULL) OR ([s_LengthTime] = @p31)) AND ((@p32 = 1 AND [s_EndDate] IS NULL) OR ([s_EndDate] = @p33)) AND ((@p34 = 1 AND [s_EnterScore] IS NULL) OR ([s_EnterScore] = @p35)) AND ((@p36 = 1 AND [s_AreaName] IS NULL) OR ([s_AreaName] = @p37)) AND ((@p38 = 1 AND [s_AreaCode] IS NULL) OR ([s_AreaCode] = @p39)) AND ((@p40 = 1 AND [s_IsStop] IS NULL) OR ([s_IsStop] = @p41)) AND ((@p42 = 1 AND [s_PhotoUrl] IS NULL) OR ([s_PhotoUrl] = @p43)) AND ((@p44 = 1 AND [s_Signature] IS NULL) OR ([s_Signature] = @p45)) AND ((@p46 = 1 AND [s_Nickname] IS NULL) OR ([s_Nickname] = @p47)) AND ((@p48 = 1 AND [s_Note] IS NULL) OR ([s_Note] = @p49)) AND ((@p50 = 1 AND [s_RegDate] IS NULL) OR ([s_RegDate] = @p51)) AND ((@p52 = 1 AND [s_IsVerify] IS NULL) OR ([s_IsVerify] = @p53)) AND ((@p54 = 1 AND [s_QDScore] IS NULL) OR ([s_QDScore] = @p55)) AND ((@p56 = 1 AND [s_XFScore] IS NULL) OR ([s_XFScore] = @p57)) AND ((@p58 = 1 AND [s_CZScore] IS NULL) OR ([s_CZScore] = @p59)) AND ((@p60 = 1 AND [s_TotalScore] IS NULL) OR ([s_TotalScore] = @p61)) AND ((@p62 = 1 AND [s_Balance] IS NULL) OR ([s_Balance] = @p63)) AND ((@p64 = 1 AND [s_Bank] IS NULL) OR ([s_Bank] = @p65)) AND ((@p66 = 1 AND [s_AccOwner] IS NULL) OR ([s_AccOwner] = @p67)) AND ((@p68 = 1 AND [s_CardID] IS NULL) OR ([s_CardID] = @p69)) AND ((@p70 = 1 AND [s_CardType] IS NULL) OR ([s_CardType] = @p71)) AND ((@p72 = 1 AND [s_AccAreaCode] IS NULL) OR ([s_AccAreaCode] = @p73)) AND ((@p74 = 1 AND [s_AccAreaName] IS NULL) OR ([s_AccAreaName] = @p75)) AND ((@p76 = 1 AND [s_QQ] IS NULL) OR ([s_QQ] = @p77)))',
    N'@p1 varchar(32),@p2 int,@p3 varchar(5),@p4 varchar(32),@p5 varchar(6),@p6 bit,@p7 int,@p8 datetime,@p9 int,@p10 varchar(7),@p11 int,@p12 varchar(8000),@p13 int,@p14 varchar(8000),@p15 int,@p16 varchar(8000),@p17 int,@p18 varchar(13),@p19 int,@p20 int,@p21 int,@p22 varchar(8),@p23 int,@p24 int,@p25 varchar(4),@p26 int,@p27 int,@p28 int,@p29 varchar(8),@p30 int,@p31 int,@p32 int,@p33 datetime,@p34 int,@p35 decimal(9,2),@p36 int,@p37 varchar(18),@p38 int,@p39 varchar(14),@p40 int,@p41 bit,@p42 int,@p43 varchar(8000),@p44 int,@p45 varchar(8000),@p46 int,@p47 varchar(8000),@p48 int,@p49 varchar(8000),@p50 int,@p51 datetime,@p52 int,@p53 bit,@p54 int,@p55 decimal(10,2),@p56 int,@p57 decimal(10,2),@p58 int,@p59 decimal(10,2),@p60 int,@p61 decimal(10,2),@p62 int,@p63 money,@p64 int,@p65 int,@p66 int,@p67 varchar(6),@p68 int,@p69 varchar(6),@p70 int,@p71 int,@p72 int,@p73 varchar(12),@p74 int,@p75 varchar(22),@p76 int,@p77 varchar(8)',
    @p1 = 'C4CA4238A0B923820DCC509A6F75849B', @p2 = 10001, @p3 = 'admin',
    @p4 = 'E10ADC3949BA59ABBE56E057F20F883E', @p5 = '张三疯', @p6 = 1, @p7 = 0,
    @p8 = '2010-12-10 00:00:00:000', @p9 = 0, @p10 = '1234567', @p11 = 1,
    @p12 = NULL, @p13 = 1, @p14 = NULL, @p15 = 1, @p16 = NULL, @p17 = 0,
    @p18 = '[email protected]', @p19 = 0, @p20 = 10036271, @p21 = 0, @p22 = '荣成一中',
    @p23 = 1, @p24 = 0, @p25 = '高三', @p26 = 0, @p27 = 301, @p28 = 0,
    @p29 = '理科11班', @p30 = 1, @p31 = NULL, @p32 = 0,
    @p33 = '2013-06-08 00:00:00:000', @p34 = 1, @p35 = NULL, @p36 = 0,
    @p37 = '山东,威海市,荣成市', @p38 = 0, @p39 = '37,3710,371082', @p40 = 0, @p41 = 0,
    @p42 = 1, @p43 = NULL, @p44 = 1, @p45 = NULL, @p46 = 1, @p47 = NULL,
    @p48 = 1, @p49 = NULL, @p50 = 0, @p51 = '2010-12-07 00:00:00:000',
    @p52 = 0, @p53 = 0, @p54 = 0, @p55 = 0, @p56 = 0, @p57 = 0, @p58 = 0,
    @p59 = 4.00, @p60 = 0, @p61 = 4.00, @p62 = 0, @p63 = $800.0000, @p64 = 0,
    @p65 = 4, @p66 = 0, @p67 = '张本山', @p68 = 0, @p69 = '123456', @p70 = 0,
    @p71 = 0, @p72 = 0, @p73 = '3682,-1,3700', @p74 = 0, @p75 = '北京市,市辖区县,怀柔区',
    @p76 = 0, @p77 = '12345611'
//更新的代码如下
System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(m_da);
m_da.SelectCommand.CommandText ="select * from bas_Student";
m_da.SelectCommand.CommandType = CommandType.Text;
m_da.Update(dt);

解决方案 »

  1.   

    //更新的代码如下
    m_da.SelectCommand.CommandText ="select * from bas_Student";
    m_da.SelectCommand.CommandType = CommandType.Text;
    System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(m_da);
    m_da.Update(dt);
      

  2.   

    自己搞定了,加上下面这句就可以了
    cb.ConflictOption = ConflictOption.OverwriteChanges;
      

  3.   

    C# 
    public enum ConflictOption
     成员
     成员名称 说明 
     CompareAllSearchableValues 更新和删除语句将在 WHERE 子句中包含表中的所有可搜索列。这等效于指定 CompareAllValuesUpdate | CompareAllValuesDelete。 
     CompareRowVersion 如果表中存在任何 Timestamp 列,则这些列在 WHERE 子句中用于所有生成的更新语句。这等效于指定 CompareRowVersionUpdate | CompareRowVersionDelete。 
     OverwriteChanges 所有的更新和删除语句仅在 WHERE 子句中包含 PrimaryKey 列。如果未定义 PrimaryKey,则所有可搜索的列都包含在 WHERE 子句中。这等效于 OverwriteChangesUpdate | OverwriteChangesDelete。 
    刚搜了下MSDN
      

  4.   

    只要包含主键列,那么就算在额外增加100列,也只是将条件变得更苛刻(更准确),而并不会降低所谓的效率。因为SQL Server并不会简单地按照你写的条件次序执行,会首先自动使用主键索引进行匹配,然后才使用其它条件。