質問編集履歴

2

解決したので、解決方法を追記した。

2020/01/06 05:49

投稿

TAKASE_Hiroyuki
TAKASE_Hiroyuki

スコア21

test CHANGED
File without changes
test CHANGED
@@ -337,3 +337,191 @@
337
337
 
338
338
 
339
339
  どうか、よろしくお願いいたします。
340
+
341
+
342
+
343
+ #追記(解決方法)
344
+
345
+ 以下のような方法で本件は解決しましたので、本文にも追記しておきます。
346
+
347
+
348
+
349
+ まず、本文で「ここがわからない」と書いた部分については、次のようにすると画像データを保存できることが確認できました。
350
+
351
+
352
+
353
+ ```C#
354
+
355
+ // こうすればできます
356
+
357
+ comm.CommandText = "insert into mydata(name,face) values ('visual studio3',@face);";
358
+
359
+ ImageConverter converter = new ImageConverter();
360
+
361
+ byte[] fdata = (byte[])converter.ConvertTo(im2, typeof(byte[]));
362
+
363
+ var param = new SQLiteParameter("@face", System.Data.DbType.Binary);
364
+
365
+ param.Value = fdata;
366
+
367
+ comm.Parameters.Add(param);
368
+
369
+ comm.ExecuteNonQuery();
370
+
371
+ ```
372
+
373
+
374
+
375
+ つぎに、実際のプログラムでは、このような保存作業を、一度に 10000回程度実施する予定ですので、for 文を用いて、10000 回実施してみました。
376
+
377
+
378
+
379
+ ```C#
380
+
381
+ using (var conn = new SQLiteConnection("DataSource=data.db"))
382
+
383
+ {
384
+
385
+ conn.Open();
386
+
387
+ SQLiteCommand cmd = conn.CreateCommand();
388
+
389
+ ImageConverter converter = new ImageConverter();
390
+
391
+ byte[] fdata;
392
+
393
+ SQLiteParameter param;
394
+
395
+
396
+
397
+ for (int i=0; i < 10000; i++)
398
+
399
+ {
400
+
401
+ /*
402
+
403
+ cmd.CommandText = "insert into mydata(name) values (@ID)";
404
+
405
+ cmd.Parameters.Add(new SQLiteParameter("@ID", "visual studio4"));
406
+
407
+ cmd.ExecuteNonQuery();
408
+
409
+ */
410
+
411
+
412
+
413
+ cmd.CommandText = "insert into mydata(name,face) values ('visual studio5',@face);";
414
+
415
+ fdata = (byte[])converter.ConvertTo(im2, typeof(byte[]));
416
+
417
+ param = new SQLiteParameter("@face", System.Data.DbType.Binary);
418
+
419
+ param.Value = fdata;
420
+
421
+ cmd.Parameters.Add(param);
422
+
423
+ cmd.ExecuteNonQuery();
424
+
425
+
426
+
427
+ }
428
+
429
+
430
+
431
+ conn.Close();
432
+
433
+ }
434
+
435
+ ```
436
+
437
+
438
+
439
+ ところが、100000回、作業を行うのに5分から7分程度必要で、とても実用に堪えないことがわかりました。このことについては、あちこちのページで「トランザクション処理が原因で、非常に速度が遅くなる」と書いてありましたので、実際に作業の前後にトランザクションに関する命令を追加しました。
440
+
441
+
442
+
443
+ ```C#
444
+
445
+ var ts = conn.BeginTransaction();
446
+
447
+ <途中の処理>
448
+
449
+ ts.Commit();
450
+
451
+ ```
452
+
453
+
454
+
455
+ この2行を追加したプログラムは、次のとおりです。
456
+
457
+
458
+
459
+ ```C#
460
+
461
+ using (var conn = new SQLiteConnection("DataSource=data.db"))
462
+
463
+ {
464
+
465
+ conn.Open();
466
+
467
+ var ts = conn.BeginTransaction();
468
+
469
+
470
+
471
+ SQLiteCommand cmd = conn.CreateCommand();
472
+
473
+ ImageConverter converter = new ImageConverter();
474
+
475
+ byte[] fdata;
476
+
477
+ SQLiteParameter param;
478
+
479
+
480
+
481
+ for (int i=0; i < 10000; i++)
482
+
483
+ {
484
+
485
+ /*
486
+
487
+ cmd.CommandText = "insert into mydata(name) values (@ID)";
488
+
489
+ cmd.Parameters.Add(new SQLiteParameter("@ID", "visual studio4"));
490
+
491
+ cmd.ExecuteNonQuery();
492
+
493
+ */
494
+
495
+
496
+
497
+ cmd.CommandText = "insert into mydata(name,face) values ('visual studio5',@face);";
498
+
499
+ fdata = (byte[])converter.ConvertTo(im2, typeof(byte[]));
500
+
501
+ param = new SQLiteParameter("@face", System.Data.DbType.Binary);
502
+
503
+ param.Value = fdata;
504
+
505
+ cmd.Parameters.Add(param);
506
+
507
+ cmd.ExecuteNonQuery();
508
+
509
+
510
+
511
+ }
512
+
513
+
514
+
515
+ ts.Commit();
516
+
517
+ conn.Close();
518
+
519
+ }
520
+
521
+ ```
522
+
523
+
524
+
525
+ 今度は、作業は数秒で終了してしまいました。
526
+
527
+ 以上、報告です。

1

「ありまえす」⇒「ありえます」

2020/01/06 05:49

投稿

TAKASE_Hiroyuki
TAKASE_Hiroyuki

スコア21

test CHANGED
File without changes
test CHANGED
@@ -242,7 +242,7 @@
242
242
 
243
243
 
244
244
 
245
- 次にデータベースにレコードを登録します。mydata テーブルのうち、name については、 TEXT NOT NULL ですので、必ず登録しなければなりませんが、face BLOB については、登録しない場合もあります。
245
+ 次にデータベースにレコードを登録します。mydata テーブルのうち、name については、 TEXT NOT NULL ですので、必ず登録しなければなりませんが、face BLOB については、登録しない場合もあります。
246
246
 
247
247
 
248
248