日期:2014-05-17  浏览次数:20785 次

请求个关于C#datagirdview更新数据库的问题
现在有个问题,就是关于效率问题,我需要在一个forech循环中对datagirdview所需要的数据表进行操作,涉及到2个表,一个是已经存在的表A,一个是需要在datagirdview中显示用的表B,表B的数据来源于表A
程序第一次运行datagirdview所在窗体的时候,表B可能为空,也可能有部分数据。此时我需要在forech循环之前先清空表B,再遍历表A,获取一个datatable,然后再表B中查找数据(where表A的某一个字段),如果该条数据在表B中存在,则不处理,如果不存在,则插入表B数据(插入的内容来源于表A的某几个字段)。
当forech循环完毕,表B也存在需要的数据了,然后调用刷新datagirdview的函数,让表B的数据在datagirdview中显示。
问题来了:
1、forech循环前进行两次次SQL数据库操作(一次清空表B,一次获取表A),这个基本上不影响效率吧??
2、在forech循环过程中,我要进行2次SQL数据库操作(一次用来查找是否存在数据,一次用来插入),感觉效率很受影响。现象就是我点击打开窗体按钮后,窗体出现前有延迟。
我同事用的C++builder,我看他写的类似的代码,forech循环前通过ADOTABLE1->Delete来清空表B,    forech循环里面就一次SQL数据库操作(用来查找是否存在数据),然后再插入的时候直接用ADOTABLE1->APPend(需要插入的内容)就实现了。
ADOTABLE1应该是datagirdview静态绑定的数据集?(对C++Builder不太懂,猜测如此,我没在他的程序里面看到动态添加数据到datagirdview的代码)

C#里面是否有这样的办法呢?

代码如下,大家可以帮我看看
//清空datagirdview并清空数据库表B。   linkAccess是我做的关于数据库操作的类
 GridViewForProtector.Rows.Clear();
 sql = string.Format("delete Protector from Protector");
 linkAccess.UpdataOEqu(sql, conn);
//获取数据表A
 sql = "select * from Circuitry order by Circuitry_GlobalID";
 CircuitryTable = linkAccess.GetDBTabFromOEquipment(sql, conn);
//获取表B中的数据行数
sql = "select * from Protector ";
ProtectorTable = linkAccess.GetDBTabFromOEquipment(sql, conn);
int count = ProtectorTable.Rows.Count;
//遍历表A进入循环
foreach (DataRow dr in CircuitryTable.Rows)
            {
                string id = dr[1].ToString();
//查找表B中时候有相关数据,如果存在不操作,否则将表A的某几个字段,插入数据表B中
                sql = string.Format("select * from Protector where ID='{0}'",id);
                tempProtectorTable = linkAccess.GetDBTabFromOEquipment(sql, conn);
                if (tempProtectorTable.Rows.Count > 0)
                { }
                else
                {
                    int tempGloId = Convert.ToInt32(dr[0]);
                    string tempId = dr[1].ToString();
                    string tempName = dr[2].ToString();
                    int order = count;

                    sql = string.Format("insert into Protector(GlobalID,ID,Remark,ForOrder) VALUES({0},'{1}','{2}',{3})",tempGloId,tempId,tempName,order);
                    if (linkAccess.updateAccess(sql, conn))