Convertir byte [] array TO sqldbtype.Varbinary usando Dapper

c# dapper entity-framework sql sql-server

Pregunta

Encontré un código recortado en Internet que inserta un documento como una matriz de bytes en la base de datos. Es como sigue:

    public void databaseFilePut(string varFilePath)
    {
        byte[] file;
        using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read))
        {
            using (var reader = new BinaryReader(stream))
            {
                file = reader.ReadBytes((int)stream.Length);
            }
        }

        //using (var varConnection = Locale.sqlConnectOneTime(Locale.slqDataConnectionDetails))
        using (SqlConnection connection = new SqlConnection(connectionString))
        using (var sqlWrite = new SqlCommand("INSERT INTO EXCEL_EM_BYTES (DOCUMENTO_BYTES) Values(@File)", connection))
        {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
            connection.Open();
            sqlWrite.ExecuteNonQuery();
            connection.Close();
        }
    }

Ahora, tengo que aplicar eso al marco de trabajo de Dapper / Entity, pero hasta ahora, sin éxito. Lo que obtuve hasta ahora es el siguiente:

      public void InsereRegistroEmail(string a, string b, string c, byte[] anexoBytes)
    {
        //var cn = _context.Database.Connection;

        //cn.Execute(string.Format(QueriesSAC.InsereRegistroEmailBanco, motivoEmail, nomeGestor, corpoEmail, anexoBytes));

        var cn = _context.Database.Connection;
        //var A = new SqlParameter("@A", SqlDbType.VarBinary, anexoBytes.Length);
        //A.Value = anexoBytes;

        var sql =(string.Format("INSERT INTO [LOG_EMAIL] ([GSTOR_DSTNA] ,[ASSNT],[DATA_ENVIO],[CORPO_EMAIL],[ANEXO]) VALUES('{0}','{1}', GETDATE(),'{2}', @A)", a, b, c));
        var A = new DynamicParameters();
        A.Add("@A", anexoBytes, dbType: DbType.Binary, direction: ParameterDirection.Input);
        A.Get<DbType>("@A");
        cn.Execute(sql);
    }

La línea clave aquí es:

         sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;

Como es el que establece el tipo de datos a VarBinary. Realmente necesito un poco de ayuda aquí...

El conjunto de archivos es anexoBytes.

Respuesta aceptada

Dapper puede manejar las asignaciones a través de un tipo anónimo que tomará el lugar de los valores de los parámetros, por lo que en su ejemplo, simplemente cambiaría su SQL para definir algún SQL parametrizado, luego pasaría el nuevo objeto que contiene los valores para esos parámetros. Esto correlacionará automáticamente los valores con sus parámetros y evitará la necesidad de definirlos manualmente o realizar un reemplazo de cadenas en su SQL.

_connection.Execute("INSERT INTO [LOG_EMAIL] ([GSTOR_DSTNA] ,[ASSNT],[DATA_ENVIO],[CORPO_EMAIL],[ANEXO]) VALUES(@DstNa, @Assnt, GETDATE(), @CorpEmail, @Anexo",
            new { DstNa = a, Assnt = b, CorpEmail = c, Anexo = anexoBytes });


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué