【问题标题】:Parsing excel .xls database into sql server database将excel .xls 数据库解析为sql server 数据库
【发布时间】:2013-09-30 07:56:56
【问题描述】:

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

控制台应用程序:

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。我将null更改为“123456789”,然后下一个错误将是invalidQuestion,然后我也从null更改为“123456789”。在此之后它告诉我我的无效密码。此外,我在web.configrequiresQuestionAndAnswer="false" 的会员提供商行中添加了下一行。

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

【问题讨论】:

    标签: c# asp.net sql excel asp.net-mvc-4


    【解决方案1】:

    每当我需要像这样从电子表格中导入数据时,只需在我的解决方案中编写一个 Importer 控制台应用程序即可。我还使用 LINQ to CSV,您可以从 Nuget 获得它,它是一个非常有用的工具。

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

    【讨论】:

    • 当我使用 ado.net 而不是 register 方法时,一切正常,但我无法通过此方法创建的用户登录。
    【解决方案2】:

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

    然后,您可以在将每个元素插入数据库时​​拆分它们。这可以使用 foreach 循环轻松完成,例如:

    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
        }
    
    }   
    

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2018-03-16
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多