我在将Excle中的数据导入到SQL的时候,先通过DataSet作为缓存,然后再与数据库中的2张表中的数据逐条比较,没有则进行插入。但是DataSet中的数据与Excle是一致的,循环能够执行完成,但是不知道为什么数据库中始终只有10多条数据能够正确导入请求大神指点。在三层架构的条件下。网上看了有说是因为对数据库的断开过于频繁,导致数据丢失

解决方案 »

  1.   

    网上看了有说是因为对数据库的断开过于频繁,导致数据丢失
    ========================
    不会的,你在保存DataSet时跟踪一下,看看DataSet里到底有多少条记录?另外记录的行状态(即RowState)必须为Added时才插入到数据库
      

  2.   

    DataSet中的数据跟Excle内的数据时一致的
      

  3.   

    的确,rowstate的状态是unchanged,那 我该怎么做呢?
      

  4.   

    那你看看每条记录的行状态是不是Added,
    还有是不是有些记录不符合数据库结构,从而没插入进去,你把关键代码贴出来看看
      

  5.   


     for (int i = 0; i < studentCount; i++)
                        {
                            string stuNumber = dr[i]["学生学号"].ToString();
                            mquery.StuNumber = stuNumber;
                            if (BLL.TeachingClassDetailsManager.Instance.Exists(mquery))
                            {
                                continue;
                            }
                            else
                            {
                                Model.TeachingClassDetails model = new Model.TeachingClassDetails();
                                model.TeachingClassDetailsID = DateTime.Now.ToString();
                                model.StuNumber = stuNumber;                          
                                model.TeachingClassID = classID;
                                try
                                {
                                    BLL.TeachingClassDetailsManager.Instance.Add(model);
                                }
                                catch (Exception ex)
                                {
                                    
                                }                             
                                if (BLL.StudentInfoManager.Instance.Exists(stuNumber))
                                {
                                    continue;
                                }
                                else
                                {
                                    stuModel.StuNumber = dr[i]["学生学号"].ToString();
                                    stuModel.ICNumber = dr[i]["身份证号"].ToString();
                                    stuModel.Name = dr[i]["姓名"].ToString();
                                    stuModel.Sex = dr[i]["性别"].ToString();
                                    stuModel.Password = Common.Method.MD5Encryption(dr[i]["学生学号"].ToString());
                                    stuModel.MajorName = dr[i]["专业名称"].ToString();
                                    stuModel.DepartmentName = dr[i]["院校名称"].ToString();
                                    stuModel.ClassName = labClassName.Text.Trim();
                                    stuModel.Memo = dr[i]["备注"].ToString();                                BLL.StudentInfoManager.Instance.Add(stuModel);
                                }
                            }
                        }
      

  6.   

    stuModel每次不用new吗?                                 else
                                {
                                    stuModel=new Model.StudentInfo();
                                    stuModel.StuNumber = dr[i]["学生学号"].ToString();                                stuModel.ICNumber = dr[i]["身份证号"].ToString();
                                    stuModel.Name = dr[i]["姓名"].ToString();
                                    stuModel.Sex = dr[i]["性别"].ToString();
                                    stuModel.Password = Common.Method.MD5Encryption(dr[i]["学生学号"].ToString());
                                    stuModel.MajorName = dr[i]["专业名称"].ToString();
                                    stuModel.DepartmentName = dr[i]["院校名称"].ToString();
                                    stuModel.ClassName = labClassName.Text.Trim();
                                    stuModel.Memo = dr[i]["备注"].ToString();                                BLL.StudentInfoManager.Instance.Add(stuModel);
                                }
      

  7.   

    这个不用NEW吧,我只需要检查数据库中有没有与学号相同的,有就不管,没有就把新的值给前面new好的model,然后提交回数据库吧,这样应该可以吧....
     Model.TeachingClassDetails model = new Model.TeachingClassDetails();
                                model.TeachingClassDetailsID = DateTime.Now.ToString();
                                model.StuNumber = stuNumber;                          
                                model.TeachingClassID = classID;
                                try
                                {
                                    BLL.TeachingClassDetailsManager.Instance.Add(model);
                                }主要是这里的数据插入不了,只能插入几条。但是循环是完成了的,DateSet里面的数据也是跟Excle一致的
      

  8.   

    我调试循环的时候,用比较慢的速度,会没有问题,数据都能插入,但是直接在for断点,然后一直按下F5的时候,会弹登录超时,会不会是这样的问题?
      

  9.   

    用事务提交试试,这样情况下 我怎么感觉 是timeout 的问题
      

  10.   

    我清空过数据库的保证了表TeachingClassDetailsManager没有数据。事务的话。
      

  11.   

    遍历DataSet拼出sql语句,用事务一次提交,应该可以写进去数据的,试试看,我们做大批量数据导入时10000+都正常导入的!
      

  12.   

    如果只是往一张表里面提交,不检验是否存在记录可以拼接SQL或者使用SqlBulkCopy
    但是现在需要验证记录是否存在,而且是对2张表操作....
      

  13.   

    问题解决了
    model.TeachingClassDetailsID = DateTime.Now.ToString();
    因为在同一时间插入的数据量太大,导致主键重复,所以被丢掉了很多数据。
    model.TeachingClassDetailsID = Guid.NewGuid().ToString().Replace("-","");
    这样就可以避免这个问题了