質問編集履歴
2
解決したので、解決方法を追記した。
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
「ありまえす」⇒「ありえます」
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
|
|