質問編集履歴

2

ODP.NETを使用したソースに変更しました。

2020/11/13 08:35

投稿

mShintani
mShintani

スコア0

test CHANGED
File without changes
test CHANGED
@@ -282,6 +282,214 @@
282
282
 
283
283
 
284
284
 
285
+ 上記からODP.NETを使用したソースに変更しました。
286
+
287
+ TYPEを使用しないPROCEDUREの場合、成功しました。
288
+
289
+
290
+
291
+ 以下は配列をやめてみて、TYPEのみの受け渡しを記載しました。
292
+
293
+
294
+
295
+ 実行すると「Cmd.ExecuteNonQuery(); 」の部分でエラーが発生します。
296
+
297
+ TYPEでない場合、成功するので、listOutType.Add(OracleDbType.Object); が
298
+
299
+ 悪いのか、「listOutName.Add("p_out_Kaikobi"); 」の設定が悪いと思っております。
300
+
301
+
302
+
303
+ バインディングというのがピンときておりません。
304
+
305
+
306
+
307
+ ```ここに言語を入力
308
+
309
+ CREATE OR REPLACE PROCEDURE TB_P_TEST2
310
+
311
+ ( p_in_iBumon IN NUMBER
312
+
313
+ , p_out_Kaikobi OUT TB_T_KAIKOBI
314
+
315
+ )
316
+
317
+ IS
318
+
319
+
320
+
321
+ BEGIN
322
+
323
+ /* 返り値セット */
324
+
325
+ p_out_Kaikobi := TB_T_KAIKOBI('20201112',0);
326
+
327
+
328
+
329
+ COMMIT;
330
+
331
+
332
+
333
+ END;
334
+
335
+ /
336
+
337
+ ```
338
+
339
+ ```ここに言語を入力
340
+
341
+ private void btnTest_Click(object sender, EventArgs e)
342
+
343
+ {
344
+
345
+ List<object> listValue = new List<object>();
346
+
347
+ listValue.Add(1);
348
+
349
+
350
+
351
+ List<OracleParameter> listInitOut = GetProcedure(listValue, "TB_P_TEST2");
352
+
353
+ }
354
+
355
+
356
+
357
+
358
+
359
+ /// <summary>
360
+
361
+ /// プロシージャ情報の取得
362
+
363
+ /// </summary>
364
+
365
+ public List<OracleParameter> GetProcedure(List<object> listValue, string strProcedure)
366
+
367
+ {
368
+
369
+ //データベースの接続先を指定
370
+
371
+ OracleConnection OraConn = new OracleConnection();
372
+
373
+ OraConn.ConnectionString = /*接続先文字列*/;
374
+
375
+ OraConn.Open();
376
+
377
+
378
+
379
+
380
+
381
+ OracleCommand Cmd = new OracleCommand();
382
+
383
+ //データベース接続を開く
384
+
385
+ OraConn.Open();
386
+
387
+ Cmd.Connection = OraConn;
388
+
389
+ //コマンドタイプをストアドプロシージャにする
390
+
391
+ Cmd.CommandType = CommandType.StoredProcedure;
392
+
393
+ //実行するストアドプロシージャを指定
394
+
395
+ Cmd.CommandText = strProcedure;
396
+
397
+
398
+
399
+ //ストアドプロシージャのin用パラメータ作成
400
+
401
+ List<string> listInName = new List<string>();
402
+
403
+ List<OracleDbType> listInType = new List<OracleDbType>();
404
+
405
+
406
+
407
+ listInName.Add("1");
408
+
409
+ listInType.Add(OracleDbType.Decimal)
410
+
411
+
412
+
413
+ //Inパラメータの追加
414
+
415
+ int intInPrameter = 0;
416
+
417
+ foreach (string strName in listInName)
418
+
419
+ {
420
+
421
+ Cmd.Parameters.Add(strName, listInType[intInPrameter]).Value = listValue[intInPrameter];
422
+
423
+ intInPrameter++;
424
+
425
+ }
426
+
427
+
428
+
429
+ //ストアドプロシージャのout用パラメータ作成
430
+
431
+ List<OracleParameter> listOutpara = new List<OracleParameter>();
432
+
433
+
434
+
435
+ //リストのタイプを作成
436
+
437
+ List<string> listOutName = new List<string>();
438
+
439
+ List<OracleDbType> listOutType = new List<OracleDbType>();
440
+
441
+ OutParamInfo outInfo = new OutParamInfo();
442
+
443
+
444
+
445
+ listOutName.Add("p_out_Kaikobi"); //←ここのセット方法がどのようにすればよいかがわかっておりません
446
+
447
+ listOutType.Add(OracleDbType.Object); //←Objectに変更したところ、型が正しくありませんは解消されました
448
+
449
+
450
+
451
+ //Outパラメータの追加
452
+
453
+ int intOutPrameter = 0;
454
+
455
+
456
+
457
+ foreach (string strName in listOutName)
458
+
459
+ {
460
+
461
+ OracleParameter outPara = new OracleParameter(strName, listOutType[intOutPrameter]);
462
+
463
+ outPara.Direction = ParameterDirection.Output;
464
+
465
+ outPara.Size = 40;
466
+
467
+ listOutpara.Add(outPara);
468
+
469
+ Cmd.Parameters.Add(outPara);
470
+
471
+ intOutPrameter++;
472
+
473
+ }
474
+
475
+
476
+
477
+ //ストアドプロシージャの実行
478
+
479
+ Cmd.ExecuteNonQuery(); //←ここで「p_out_Kaikobi」バインディングが無効ですとなります。
480
+
481
+
482
+
483
+ return listOutpara;
484
+
485
+ }
486
+
487
+ }
488
+
489
+ }
490
+
491
+ ```
492
+
285
493
 
286
494
 
287
495
  ### 試したこと

1

ソースコードをMarkdownを利用し変更しました。

2020/11/13 08:35

投稿

mShintani
mShintani

スコア0

test CHANGED
File without changes
test CHANGED
@@ -34,6 +34,8 @@
34
34
 
35
35
  <TYPE>
36
36
 
37
+ ```ここに言語を入力
38
+
37
39
  CREATE OR REPLACE TYPE TB_T_KAIKOBI FORCE
38
40
 
39
41
  AS OBJECT (
@@ -46,7 +48,9 @@
46
48
 
47
49
  /
48
50
 
49
-
51
+ ```
52
+
53
+ ```ここに言語を入力
50
54
 
51
55
  CREATE OR REPLACE TYPE TB_T_KAIKOBI_A FORCE
52
56
 
@@ -54,10 +58,14 @@
54
58
 
55
59
  /
56
60
 
61
+ ```
62
+
57
63
 
58
64
 
59
65
  <PROCEDURE>
60
66
 
67
+ ```ここに言語を入力
68
+
61
69
  CREATE OR REPLACE PROCEDURE TB_P_TEST
62
70
 
63
71
  ( p_in_iBumon IN NUMBER
@@ -110,6 +118,8 @@
110
118
 
111
119
  /
112
120
 
121
+ ```
122
+
113
123
 
114
124
 
115
125
  ※INパラメータの「p_in_iBumon」は実際には使用しますが、
@@ -120,6 +130,8 @@
120
130
 
121
131
  【C#側】
122
132
 
133
+ ```ここに言語を入力
134
+
123
135
  private void btnTest_Click(object sender, EventArgs e)
124
136
 
125
137
  {
@@ -266,7 +278,7 @@
266
278
 
267
279
  }
268
280
 
269
-
281
+ ```
270
282
 
271
283
 
272
284