Usar el parámetro nombrado solo cuando se pasa un entero

.net c# dapper sqlanywhere

Pregunta

Actualmente estoy tratando de trabajar con Named Parameters usando SAP Sybase SQL Anywhere 12 con dapper. Los siguientes códigos se ejecutan correctamente:

public class Test
{
    public int Str1
    {
        get;
        set;
    }

    public string Str2
    {
        get;
        set;
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (SAConnection connection = new SAConnection("..."))
        {
            connection.Open();

            Test test = connection.Query<Test>("SELECT :Str1 as Str1, :Str2 as Str2",
                new Test() { Str1 = 35, Str2 = "42" }).FirstOrDefault();                    

            Console.WriteLine($"Str1: {test.Str1} | Str2: {test.Str2}");
            Console.ReadLine();
        }
    }
}

Pero cuando cambio Str2 = "42" a alguna string , obtengo la siguiente excepción:

Echar 42a a entero no es posible

Esta excepción se produce cuando estoy usando el siguiente código:

Test test = connection.Query<Test>("SELECT :Str1 as Str1, :Str2 as Str2",
new Test() { Str1 = 35, Str2 = "42a" }).FirstOrDefault();  

¿Hay algún problema conocido? Esto debería funcionar correctamente, porque solo quiero pasar una cadena.

Editar

Stack trace:

iAnywhere.Data.SQLAnywhere.SAException (0x80004005): Umwandeln von '42a' auf integer nicht möglich bei iAnywhere.Data.SQLAnywhere.SACommand._ExecuteReader (CommandBehavior commandBehavior, Boolean isExecuteScalar, Boolean isBeginExecuteReader) bei iAnywhere.Data.SQLAnywhere.SACommand .ExecuteDbDataReader (comportamiento CommandBehavior) bei System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (comportamiento CommandBehavior) bei Dapper.SqlMapper.d__61 1.MoveNext() bei System.Collections.Generic.List 1..ctor ( Colección IEnumerable 1 collection) bei System.Linq.Enumerable.ToList[TSource](IEnumerable fuente 1 collection) bei System.Linq.Enumerable.ToList[TSource](IEnumerable 1) bei Dapper.SqlMapper.Query [T] (IDbConnection cnn, String sql, Object param, Transacción IDbTransaction, Boolean buffer, Nullable 1 commandTimeout, Nullable 1 commandType) bei DapperSqlAnywhere.Program.Main (String [] args) en C: \ Users .... \ DapperSqlAnywhere \ Program.cs: Zeile 35.

¡Muchas gracias!

Respuesta popular

No sé mucho sobre SQLAnywhere, pero en su primera declaración de selección se está analizando como

SELECT 35 as Str1, 42 as Str2

lo cual está bien porque ambos son enteros Tu segunda declaración

SELECT 35 as Str1, 42a as Str2

debería ser probablemente

SELECT 35 as Str1, '42a' as Str2

Así que trataría de cambiar el código a

Test test = connection.Query<Test>("SELECT :Str1 as Str1, ':Str2' as Str2",
            new Test() { Str1 = 35, Str2 = "42" }).FirstOrDefault();


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é