0

私は asp.net mvc4 プロジェクトを持っています。そこには学生のデータベースがあり、.xls 形式の古いデータベースもあり、すべての値を古いデータベースから新しい 1 つの SQL サーバー データベースに移行する必要があります。私のmvcプロジェクトには、新しい学生を登録するためのメソッドを含むメンバーシップコントローラーがあります。また、.x​​ls テーブルを解析し、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;
    }

アクション結果 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" に変更すると、次のエラーが発生し、さらにinvalidQuestionnull から "123456789" に変更されます。そして、この後、私の無効なパスワードを教えてください。また、次の行が my のメンバーシップ プロバイダーの行に追加されますweb.config requiresQuestionAndAnswer="false"

なぜ機能しないのかわかりません。誰にもアイデアはありますか?

4

2 に答える 2

1

このようなスプレッドシートからデータをインポートする必要があるときはいつでも、ソリューションにインポーター コンソール アプリを記述するだけです。また、Nuget から入手できるLINQ to CSVも使用しています。これは非常に便利なツールです。

スプレッドシートから関連するクラス オブジェクトにデータを読み込むことができます。そこから、各オブジェクトを検証したら、データ レイヤーを使用してデータベースに新しいオブジェクトを簡単に作成できます。

于 2013-09-30T09:26:31.947 に答える
0

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
    }

}   
于 2013-09-30T08:42:04.763 に答える