정수를 전달할 때만 명명 된 매개 변수 사용

.net c# dapper sqlanywhere

문제

현재 SAP Sybase SQL Anywhere 12 를 사용하여 Named Parameters 사용하여 작업하려고합니다. 다음 코드는 올바르게 실행됩니다.

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();
        }
    }
}

하지만 Str2 = "42" 를 일부 string 변경하면 다음 예외가 발생합니다.

42a를 정수로 변환 할 수 없음

이 예외는, 다음의 코드를 사용하고있을 때 슬로우됩니다.

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

알려진 문제가 있습니까? 이것은 올바르게 작동해야하는데, 나는 단지 문자열을 전달하려고하기 때문이다.

편집하다

스택 추적 :

iAnywhere.Data.SQLAnywhere.SAException (0x80004005) : iAnywhere.Data.SQLAnywhere.SACommand._ExecuteReader (CommandBehavior commandBehavior, 부울 isExecuteScalar, 부울 isBeginExecuteReader)로 정수를 입력 할 수 없습니다. iAnywhere.Data.SQLAnywhere.SACommand .ExecuteDbDataReader (CommandBehavior 동작) bei System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior 동작) Dapper.SqlMapper.d__61 1.MoveNext() bei System.Collections.Generic.List 1..ctor IEnumerable 1 collection) bei System.Linq.Enumerable.ToList[TSource](IEnumerable 1 소스) Dapper.SqlMapper.Query (IDbConnection cnn, String sql, Object param, IDbTransaction 트랜잭션, 버퍼링 된 부울, Nullable 1 commandTimeout, Nullable 1 commandType) C : \ Users .... \ DapperSqlAnywhere \ Program.cs에있는 DapperSqlAnywhere.Program.Main (String [] args) : Zeile 35.

고마워요!

인기 답변

SQLAnywhere에 대해 많은 것을 알지 못하지만 첫 번째 select 문은 다음과 같이 구문 분석됩니다.

SELECT 35 as Str1, 42 as Str2

둘 다 정수이기 때문에 괜찮습니다. 두 번째 성명서

SELECT 35 as Str1, 42a as Str2

아마 있어야한다.

SELECT 35 as Str1, '42a' as Str2

그래서 코드를 다음과 같이 변경하려고합니다.

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.