質問編集履歴
2
ODP.NETを使用したソースに変更しました。
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を利用し変更しました。
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
|
|