2013-09-30 55 views
0

我有asp.net mvc4项目,其中有学生数据库,也有旧数据库的.xls格式,我需要将旧数据库中的所有值迁移到新的一个sql server数据库。在我的mvc项目中,我有会员控制器,其中包括注册新学生的方法。另外我编写控制台应用程序解析.xls表,并通过寄存器方法将所有值插入到我的新数据库中。解析excel .xls数据库到sql server数据库

控制台应用程序:

static void Main(string[] args) 
    { 
     string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\MigrateExelSql\Include\TestDb.xlsx; Extended Properties=Excel 12.0;"; 

     MembershipController mc = new MembershipController(); 
     Student student = new Student(); 
     student.Username = null; 
     student.Password = "password"; 
     student.Email = null; 
     student.EntryYear = 2014; 
     student.PassportNumber = 0; 
     student.IsApproved = true; 
     student.PasswordFailuresSinceLastSuccess = 0; 
     student.IsLockedOut = false; 

     using(OleDbConnection connection = new OleDbConnection(con)) 
     { 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
      using(OleDbDataReader dr = command.ExecuteReader()) 
      { 
       while(dr.Read()) 
       { 
        string row1Col0 = dr[0].ToString(); 
        Console.WriteLine(row1Col0); 
        string row1Col1 = dr[1].ToString(); 
        Console.WriteLine(row1Col1); 
        Console.WriteLine(); 

        student.Username = row1Col0; 
        student.Email = row1Col1; 

        try 
        { 
         mc.Register(student); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex.Message); 
        } 
       } 
      } 
     } 

     Console.ReadKey(); 
    } 

注册方法

public static MembershipCreateStatus Register(string Username, string Password, string Email, bool IsApproved, string FirstName, string LastName) 
     { 
      MembershipCreateStatus CreateStatus; 
      System.Web.Security.Membership.CreateUser(Username, Password, Email, null, null, IsApproved, null, out CreateStatus); 

     if (CreateStatus == MembershipCreateStatus.Success) 
     { 
      using (UniversityContext Context = new UniversityContext(ConfigurationManager.ConnectionStrings[0].ConnectionString)) 
      { 
       Student User = Context.Students.FirstOrDefault(Usr => Usr.Username == Username); 
       User.FirstName = FirstName; 
       User.LastName = LastName; 
       Context.SaveChanges(); 

      } 

      if (IsApproved) 
      { 
       FormsAuthentication.SetAuthCookie(Username, false); 
      } 
     } 

     return CreateStatus; 
    } 

的ActionResult POST

public ActionResult Register(Student student) 
     { 
      Register(student.Username, student.Password, student.Email, true, student.FirstName, student.LastName); 

      return RedirectToAction("Index", "Membership"); 
     } 

一切都正常工作,当我尝试添加从Web应用程序的学生,但是当我尝试从我的分析数据库中添加这是得到错误的下一行

System.Web.Security.Membership.CreateUser(Username, Password, Email, null, null, IsApproved, null, out CreateStatus); 
Register方法

,即invalidAnswer。我更改为“123456789”,然后下一个错误将为invalidQuestion,然后我也从null更改为“123456789”。在此之后,它告诉我,我的invalidPassword。此外,我在我的web.configrequiresQuestionAndAnswer="false"中加入了我的会员供应商的一行。

我不知道为什么它不起作用。有人有任何想法吗?

回答

1

每当我需要做的像电子表格导入数据这样的事只是写在我的解决方案的供应商控制台应用程序:可以使用类似foreach循环可以轻松完成。我也使用LINQ到CSV,你可以从Nuget获得它,它是一个非常有用的工具。

它允许您将电子表格中的数据读入相关的类对象中,一旦您验证了每个对象,就可以使用数据层简单地在数据库中创建新对象。

+0

当我使用ado.net而不是注册方法一切正常,但我无法登录用户,我用这种方法创建。 – BorHunter

0

由于xls(而非xlsx)文件基本上是文本文件,其内容通常由制表符分隔(或者某些特定的精确字符)a better approach将读取文件中的所有行并将它们存储在列表中。

然后,您可以在将数据插入数据库时​​拆分每个元素。

foreach (var i in xlsList) { 

    String s [] = i.Split('\t').ToArray(); // refer to your file 
    for (int j = 0; j < s.lenght; j++) { 
     Your SQL statement in here 
    } 

} 
相关问题