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の機能を有効にしました。
私は様々な記事を検索し、すべてのソリューションを試してみましたので、同じよう:
- UWP UnauthorizedException
- FileStream "access is denied" error all of a sudden
- Access to file in UWP
- Windows 10 Universal App File/Directory Access
私は長い時間を費やしてきましたこれをここに掲載する前に、私の肥沃な鱗の一部を切り取ったこの問題を解決するために私の頭を掻きながらp。一括してデータを挿入するのを手伝ってください!あなたのコードで
こんにちは、私はサードパーティ製のDLL(MySql.Data.RT)を使用して、ローカルのmysqlデータベースに接続しています。悲しいことに、MySqlBulkUploaderクラスには、StorageFileではなく、ファイルの文字列パスが必要です。実際のエラーは、 'StorageFile file = StorageFile.GetFileFromPathAsync(path);を待ちます; ** OpenFile **の機能には です。 (質問を編集した)。 ファイルの保存場所については、LocalFolder、RoamingFolder、およびLocalTempフォルダも試してみました。しかし、誰も働いていませんでした(コードコメントにはまだそこにあります)。 – RameshDabhi
あなたが 'StorageFile csv = await DownloadsFolder.CreateFileAsync(DateTime.Now.ToString(" yyyyMMddHHmmssfff ")+" .csv ");を' StorageFile csv = ApplicationData.Current.LocalFolder.CreateFileAsync(DateTime。 Now.ToString( "yyyyMMddHHmmssfff")+ ".csv");はまだ "アクセスが拒否されました"というエラーがありますか? –
はい。それはまだ持続する。 MySql.Data.UWPのソースコードのソリューションでuwpプロジェクトを作成した場合(MySql.Data.RTのソースコードを取得していないが、同じであると想定している)、MySqlBulkUploader.Load ()関数は、同じコードで、デバッグモードで正常に動作しますが、リリースモードで同じエラーがスローされます。 – RameshDabhi