2014-04-24 3 views
0

odp.net을 사용하여 입력 매개 변수로 Oracle 저장 프로 시저에 바이트 배열을 전달할 때 한 가지 문제점이 있습니다.바이트 배열을 oracle 저장 프로 시저에 전달하십시오.

여기서 저장 과정 서명 :

SOMEPROCEDURE(session IN NUMBER, data IN RAW) 

다음 절차 호출 C# 코드가있다 :

var cmd = new OracleCommand("SOME_PROCEDURE", _connection); 
cmd.CommandType = CommandType.StoredProcedure; 
var bt = new byte[]{1,68,0,83,128,1}; 
OracleParameter sessionId = new OracleParameter("dbSessionId", OracleDbType.Decimal, new OracleDecimal(_dbSessionId), ParameterDirection.Input);     
OracleParameter data = new OracleParameter("statusData", OracleDbType.Raw, new OracleBinary(bt), ParameterDirection.Input); 
cmd.Parameters.Add(sessionId); 
cmd.Parameters.Add(data); 
cmd.ExecuteNonQuery(); 

이 코드는 (저장 절차는 데이터를 얻을 수없는 예외를 발생) 실패 때문에 바이트 배열 thereis 번호 128!, 내가 128 다른 번호에, 덜 128, 그것은 잘 작동!

어떻게해야합니까?

답변

0

이 시도 : 그것은 더 큰 숫자를 포함 할 수 있기 때문에

var cmd = new OracleCommand("SOME_PROCEDURE", _connection); 
cmd.CommandType = CommandType.StoredProcedure; 
int[] bt = new int[]{1,68,0,83,128,1}; 
OracleParameter sessionId = new OracleParameter("dbSessionId", OracleDbType.Decimal, new OracleDecimal(_dbSessionId), ParameterDirection.Input);     
OracleParameter data = new OracleParameter("statusData", OracleDbType.Raw, new OracleBinary(bt), ParameterDirection.Input); 
cmd.Parameters.Add(sessionId); 
cmd.Parameters.Add(data); 
cmd.ExecuteNonQuery(); 

이 아마도 바이트가 작은에 있기 때문에, int로는 작동 할 수 있습니다.

+0

'OracleBinary' 생성자가'Int32' 배열을 매개 변수로 사용하지 않으며'byte' 배열에서'int' 배열로의 암묵적인 대화가 없습니다. –

+0

나는 그것을 알지 못 했으므로 바이트 배열 2 개를 만들려고 시도 할 수있다. – Thealon

+0

바이트는 작지 않습니다. 바이트는 8 비트 부호없는 정수이므로 최대 값은 255입니다. 오라클 데이터 행에는 부호없는 8 비트 값이 포함되지 않습니다. – IComparable

0

몇 가지 실험을 한 후에 해결책을 찾았습니다. 1. 만들기 래퍼 절차

procedure SOME_PROCEDURE_WRAPPER (p_session_id in number, 
            p_data  in varchar2) 
is 
v_data raw(1024); 
rawdata raw(1024); 
rawlen number; 
hex varchar2(32760); 
i number;  
begin 

    rawlen := length(p_data); 
    i := 1; 
    while i <= rawlen-1 
    loop 
    hex := substrb(p_data,i,2); 
    rawdata := rawdata || HEXTORAW(hex); 
    i := i + 2; 
    end loop; 
    SOME_PROCEDURE(p_session_id , rawdata); 
end; 

:이 배열 그래서 127

보다 큰 값을 포함하는 경우 처음에는 는, 당신은 솔루션, odp.net을 통해 바이트의 저장 프로 시저 배열에 전달할 수 없습니다 2는이 방법으로 C# 코드를 수정해야합니다

var cmd = new OracleCommand("SOME_PROCEDURE_WRAPPER", _connection); 
cmd.CommandType = CommandType.StoredProcedure; 
string @string = statusData.ToHexString(); 
OracleParameter sessionId = new OracleParameter("dbSessionId", OracleDbType.Decimal, new OracleDecimal(_dbSessionId), ParameterDirection.Input);     
OracleParameter data = new OracleParameter("statusData", OracleDbType.Varchar2,@string.Length, new OracleString(@string), ParameterDirection.Input); 
cmd.Parameters.Add(sessionId); 
cmd.Parameters.Add(data); 
cmd.ExecuteNonQuery(); 

public static string ToHexString(this byte[] bytes) 
    { 
     if(bytes == null || bytes.Length == null) 
      return string.Empty; 
     StringBuilder hexStringBuilder = new StringBuilder(); 
     foreach (byte @byte in bytes) 
     { 
      hexStringBuilder.Append(@byte.ToString("X2")); 
     } 
     return hexStringBuilder.ToString(); 
    } 
관련 문제