2017-11-09 49 views
0

UWPアプリケーションを使用してcsvからmysqlデータベースにデータを読み込む際に問題があります。 私は基本的にやろうとしていることである:C#UWP MySql BulkLoader - csvを使用してデータを読み込むことができません

  • は自分のアプリケーションの一時フォルダ内のCSVファイルにHttpClientを経由して(200Kレコードを、32メガバイト)
  • 保存データをcsvファイルからデータを読み込み
  • がデータベース以下

にcsvファイルをロードするためにMySqlBulkLoaderクラスを使用したファイルを読み込み、挿入する必要のある列を識別することは、私がしようとしているコードです:

とすぐにデバッガが

result = mySqlBulkLoader.Load(); 

ラインを打つ、それは以下のエラースローとして

public static async Task<int> MemberEnrollment_GetFromServer_FirstSync(string _url) 
{ 
    int insertedRecords = 0; 
    string csv_data = await DownloadDataAsync(_url); 

    //StorageFolder localFolder = ApplicationData.Current.RoamingFolder; 
    //StorageFile csv = await localFolder.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".csv", CreationCollisionOption.ReplaceExisting); 
    StorageFile csv = await DownloadsFolder.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".csv"); 

    var token = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(csv); 

    try 
    { 
     await FileIO.WriteTextAsync(csv, csv_data, Windows.Storage.Streams.UnicodeEncoding.Utf8); 

     var testRead = await OpenFile(csv.Path, FileAccess.Read); 

     //batch insert into the memberenrollment table 
     insertedRecords = await DataServices.MemberEnrollment_PostToLocal_Bulk(csv); 
    } 
    catch (Exception exInsertBatch) 
    { 
     throw exInsertBatch; 
    } 
    finally 
    { 
     if (File.Exists(csv.Path)) 
      await csv.DeleteAsync(StorageDeleteOption.PermanentDelete); 
    } 
    return insertedRecords; 
} 
private static async Task<string> DownloadDataAsync(string url) 
    { 
     string data = string.Empty; 
     using (HttpClient Client = GetHttpClient()) 
     { 
      Client.Timeout = TimeSpan.FromMinutes(60); 
      data = await Client.GetStringAsync(url); 
     } 
     return data; 
    } 
private async static Task<Stream> OpenFile(string path, FileAccess access) 
{ 
    StorageFile file = await StorageFile.GetFileFromPathAsync(path); 
    if (access == FileAccess.Read) 
     return await file.OpenStreamForReadAsync(); 
    else 
     return await file.OpenStreamForWriteAsync(); 
} 

public static async Task<int> MemberEnrollment_PostToLocal_Bulk(StorageFile File) 
{ 
    int result = 0; 
    List<string> columns = new List<string>(); 
    List<string> expressions = new List<string>(); 
    try 
    { 
     //read the column names 
     var lines = await FileIO.ReadLinesAsync(File, Windows.Storage.Streams.UnicodeEncoding.Utf8); 
     foreach (var line in lines) 
     { 
      //columns = string.Join(",", line.Replace("\"", "").Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries)); 
      string[] arrHeaders = line.Replace("\"", "").Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); 
      foreach (string header in arrHeaders) 
      { 
       columns.Add(header); 
      } 

      break; 
     } 
     result = await Task.Run(() => 
     { 
      return DataLayer.MemberEnrollment_Write_Bulk(File.Path, columns, expressions); 
     }); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    return result; 
} 


public static int MemberEnrollment_Write_Bulk(string FilePath,List<string> columns,List<string> expressions) 
{ 
    int result = 0; 
    using (MySqlConnection con = DataProvider.GetConnection()) 
    { 
     MySqlBulkLoader mySqlBulkLoader = new MySqlBulkLoader(con); 
     //mySqlBulkLoader.CharacterSet = "utf8"; 
     mySqlBulkLoader.FieldQuotationCharacter = '"'; 
     mySqlBulkLoader.Expressions.AddRange(expressions); 
     //mySqlBulkLoader.EscapeCharacter = '\\'; 
     //mySqlBulkLoader.FieldTerminator = "\t"; 
     mySqlBulkLoader.FileName = FilePath; 
     mySqlBulkLoader.LineTerminator = "\\r\\n"; 
     mySqlBulkLoader.NumberOfLinesToSkip = 1; 
     mySqlBulkLoader.TableName = "AC_Memberenrollment"; 
     mySqlBulkLoader.Timeout = 120; 
     mySqlBulkLoader.Columns.AddRange(columns); 
     result = mySqlBulkLoader.Load(); 
    } 
    return result; 
} 

:実際の理由を理解するために

MySql.Data.MySqlClient.MySqlException occurred 
    HResult=0x80131500 
    Message=Fatal error encountered attempting to read the resultset. 
    Source=<Cannot evaluate the exception source> 
    StackTrace: 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) in C:\Users\ramesh\Downloads\MySql.Data.UWP-master\MySql.Data.UWP-master\MySql.Data.UWP\command.cs:line 545 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() in C:\Users\ramesh\Downloads\MySql.Data.UWP-master\MySql.Data.UWP-master\MySql.Data.UWP\command.cs:line 397 
    at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\Users\ramesh\Downloads\MySql.Data.UWP-master\MySql.Data.UWP-master\MySql.Data.UWP\command.cs:line 340 
    at MySql.Data.MySqlClient.MySqlBulkLoader.Load() in C:\Users\ramesh\Downloads\MySql.Data.UWP-master\MySql.Data.UWP-master\MySql.Data.UWP\BulkLoader.cs:line 277 
    at Controller.DAL.DataLayer.MemberEnrollment_Write_Bulk(String FilePath, List`1 columns, List`1 expressions) in E:\Work\Controller\DAL\DataLayer.cs:line 344 
    at Controller.Classes.DataServices.<>c__DisplayClass17_0.<MemberEnrollment_PostToLocal_Bulk>b__0() in E:\Work\Controller\Classes\DataServices.cs:line 1333 
    at System.Threading.Tasks.Task`1.InnerInvoke() 
    at System.Threading.Tasks.Task.Execute() 

Inner Exception 1: MySqlException: Fatal error encountered attempting 
to read the resultset. 

Inner Exception 2: MySqlException: Error during LOAD DATA LOCAL INFILE 

Inner Exception 3: NullReferenceException: Object reference not set to 
an instance of an object. 

を、私はのソースコードをダウンロードしていましたMySql.Data.UWP.dllをhttps://github.com/nudaca/MySql.Data.UWPから削除し、関数でFileStream.csでcsvファイルを開こうとしているときに実際の問題が発生することがわかりました

private async void OpenFile(string path, FileAccess access) 
{ 
    StorageFile file = await StorageFile.GetFileFromPathAsync(path);//<--error here 
    if (access == FileAccess.Read) 
    stream = await file.OpenStreamForReadAsync(); 
    else 
    stream = await file.OpenStreamForWriteAsync(); 
} 

実際のエラーは「アクセスが拒否されました」です。

WorkbenchでSqlCommandから生成されたコマンド文字列を実行すると、データが正常に読み込まれます。

インターネット(クライアント)、プライベートネットワーク(クライアント&サーバ)、リムーバブルストレージのPackage.manifestの機能を有効にしました。

私は様々な記事を検索し、すべてのソリューションを試してみましたので、同じよう:

私は長い時間を費やしてきましたこれをここに掲載する前に、私の肥沃な鱗の一部を切り取ったこの問題を解決するために私の頭を掻きながらp。一括してデータを挿入するのを手伝ってください!あなたのコードで

答えて

0

、あなたはDownloadsFolderにStorageFile CSVファイルを作成し、のOpenFile方法でファイルを取得するために、ファイルパスを使用しています。 UWPアプリケーションはサンドボックスで実行され、ファイルシステムへのアクセスは非常に制限されており、StorageItem(StorageFolderとStorageFile)はパスではなくWindowsストアアプリの正規ストレージ識別子です。 RobのブログSkip the path: stick to the StorageFileを参照してください。

あなたの問題として、あなたは、私たちのローカルフォルダ(ApplicationData.Current.LocalFolder)に格納されたデータは、我々はパスを使用することができますので、代わりにDownloadsFolderlocalfolder。ここを使用しようとすることができます。 UWPアプリケーションがアクセスできるファイルシステムの場所の詳細については、を参照してください。

+0

こんにちは、私はサードパーティ製のDLL(MySql.Data.RT)を使用して、ローカルのmysqlデータベースに接続しています。悲しいことに、MySqlBulkUploaderクラスには、StorageFileではなく、ファイルの文字列パスが必要です。実際のエラーは、 'StorageFile file = StorageFile.GetFileFromPathAsync(path);を待ちます; ** OpenFile **の機能には です。 (質問を編集した)。 ファイルの保存場所については、LocalFolder、RoamingFolder、およびLocalTempフォルダも試してみました。しかし、誰も働いていませんでした(コードコメントにはまだそこにあります)。 – RameshDabhi

+0

あなたが 'StorageFile csv = await DownloadsFolder.CreateFileAsync(DateTime.Now.ToString(" yyyyMMddHHmmssfff ")+" .csv ");を' StorageFile csv = ApplicationData.Current.LocalFolder.CreateFileAsync(DateTime。 Now.ToString( "yyyyMMddHHmmssfff")+ ".csv");はまだ "アクセスが拒否されました"というエラーがありますか? –

+0

はい。それはまだ持続する。 MySql.Data.UWPのソースコードのソリューションでuwpプロジェクトを作成した場合(MySql.Data.RTのソースコードを取得していないが、同じであると想定している)、MySqlBulkUploader.Load ()関数は、同じコードで、デバッグモードで正常に動作しますが、リリースモードで同じエラーがスローされます。 – RameshDabhi

関連する問題