2016-08-19 128 views
0

所以,我正在使用web api来检索图像!但是,在DB上,图像是一个LongRaw。林看到的,我需要使用OracleDbType.Blob 但是,当我尝试用这个谷歌,从Oracle数据库检索图像

public IEnumerable<FotoEnvolvido> GetFoto(string suspid) 
     { 

      DataSet lretorno = new DataSet(); 

      string connectionString = GetConnectionString(); 
      using (OracleConnection connection = new OracleConnection()) 
      { 
       connection.ConnectionString = connectionString; 

       OracleDataReader reader = null; 
       OracleCommand cmd = new OracleCommand(); 
       cmd.InitialLONGFetchSize = 50000; 
       cmd.Connection = connection; 
       cmd = new OracleCommand("MOBILE.XAPIMANDADOMOBILE.BUSCAFOTO", connection); 
       cmd.CommandType = CommandType.StoredProcedure; 

       //variáveis entrada    
       cmd.Parameters.Add(new OracleParameter("SUSPID", suspid)); 
       //variáveis de saida   
       cmd.Parameters.Add(new OracleParameter("oretorno", OracleDbType.Blob)).Direction = ParameterDirection.Output; 

       connection.Open(); 
       cmd.ExecuteNonQuery(); 
       OracleDataAdapter da = new OracleDataAdapter(cmd); 

       da.Fill(lretorno); 

       reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

       //CRIO A LISTA 
       lretorno.Load(reader, LoadOption.OverwriteChanges, "BUSCAFOTO"); 
       connection.Close(); 
       connection.Dispose(); 

       var teste = lretorno.Tables[0].AsEnumerable().Select(row => new FotoEnvolvido 
       { 
        FOTO = (byte[])(row["FOTO"]), 
       }); 

       return teste; 
      } 
     } 

我有cmd.ExecuteNonQuery()一个错误:

"ORA-06550: linha 1, coluna 7:\nPLS-00306: número errado ou tipos de argumentos na chamada para 'BUSCAFOTO'\nORA-06550: linha 1, coluna 7:\nPL/SQL: Statement ignored" 

Oracle.ManagedDataAccess.Client.OracleException was unhandled by user code 
    DataSource="" 
    ErrorCode=-2147467259 
    HResult=-2147467259 
    IsRecoverable=false 
    Message=ORA-06550: linha 1, coluna 7: 
PLS-00306: número errado ou tipos de argumentos na chamada para 'BUSCAFOTO' 
ORA-06550: linha 1, coluna 7: 
PL/SQL: Statement ignored 
    Number=6550 
    Procedure="" 
    Source=Oracle Data Provider for .NET, Managed Driver 
    StackTrace: 
     em OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone) 
     em OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl, Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean bFirstIterationDone) 
     em OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, Boolean isFromEF) 
     em Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery() 
     em WebApiApp.Controllers.FotoController.GetFoto(String suspid) na C:\Users\50216740\Documents\Visual Studio 2015\Projects\AppMobilePCRJ\AppMobilePCRJ\WebApiApp\Controllers\FotoController.cs:linha 49 
     em lambda_method(Closure , Object , Object[]) 
     em System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) 
     em System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
     em System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) 
    InnerException: 

如果我使用OracleDbType.RefCursor像其他Web apis我得到的字符串,不要给我这个错误...问题是,参数[{“ISUSPID”:0,“FOTO”:“”}]],即使在DB上给我带来的形象!

我是什么doind错了,那该FOTO是空的JSON的???

回答

1

我不知道什么lretorno.Load(...)是做来读取数据,但使用select语句这个须藤代码示例可以帮助你......我一直有专门拿到BLOB并读出它以获取过去的字节。

实施例用于检索LONG RAW字段类型字段

var imgCmd = new OracleCommand("SELECT photo FROM photos WHERE photo_id = 1", _con); 
imgCmd.InitialLONGFetchSize = -1; // Retrieve the entire image during select instead of possible two round trips to DB 
var reader = imgCmd.ExecuteReader(); 
if (reader.Read()) { 
    // Fetch the LONG RAW 
    OracleBinary imgBinary = reader.GetOracleBinary(0); 
    // Get the bytes from the binary obj 
    byte[] imgBytes = imgBinary.IsNull ? null : imgBinary.Value; 
} 
reader.Close(); 

实施例用于检索BLOB 数据类型

var imgCmd = new OracleCommand("SELECT photo FROM photos WHERE photo_id = 1", _con); 
var reader = imgCmd.ExecuteReader(); 
if (reader.Read()) { 
    // Fetch the blob 
    OracleBlob imgBlob = reader.GetOracleBlob(0); 
    // Create byte array to read the blob into 
    byte[] imgBytes = new byte[imgBlob.Length]; 
    // Read the blob into the byte array 
    imgBlob.Read(imgBytes, 0, imgBlob.Length); 
} 
reader.Close(); 
+0

对不起慢!!并感谢您的答案... 但谁是参数“blob”?您所使用blob.Lenght –

+0

哎呀,我会更新现在@MarceloCFernandes – xer21

+0

,你可以从你得到了Oracle BLOB对象,它可以告诉你的BLOB的长度,然后该对象还具有读取功能来填充读者看到一个字节数组 – xer21