2014-01-23 3 views
1

데이터베이스에서 문자열 값을 반환하려고하지만 대신 SELECT 쿼리가 nvarchar 열을 대상으로하고 있지만 쿼리가 "0"을 반환합니다. 쿼리가 유효하고 올바르게 실행되어 SQL-SMS를 사용하여 실행할 때 "KYO"를 반환합니다. 이는 int를 반환 것 같은 캐스트 예외를 던지고하는 방법입니다Int를 반환하는 Nvarchar 열에 대한 SELECT 쿼리

public static object GetData(string sql, SqlParameter[] parameters) 
    { 
     try 
     { 
      using (DbConnection connection = factory.CreateConnection()) 
      { 
       connection.ConnectionString = connectionString; 

       using (DbCommand command = factory.CreateCommand()) 
       { 
        command.Connection = connection; 
        command.CommandType = CommandType.Text; 
        command.CommandText = sql; 

        if (parameters != null) 
        { 
         foreach (var parameter in parameters) 
         { 
          if (parameter != null) 
           command.Parameters.Add(parameter); 
         } 
        } 

        object result = null; 
        SqlParameter returnValue = new SqlParameter("ReturnValue", result); 
        returnValue.Direction = ParameterDirection.ReturnValue; 
        command.Parameters.Add(returnValue); 

        connection.Open(); 
        command.ExecuteScalar(); 
        result = command.Parameters["ReturnValue"].Value; 
        return result; 
       } 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

:

내가 데이터를 반환에 사용하는, 내가 그것을 사용하는 다른 장소에서 예상대로 작동하는 방법이다 대신 문자열 :

private static String GetManufacturerCode(Int32 manufacturerID) 
    { 
     try 
     { 
      StringBuilder sql = new StringBuilder(); 
      sql.Append("SELECT ManufacturerCode FROM Manufacturers WHERE ManufacturerID = @ID"); 

      SqlParameter id = new SqlParameter("@ID", manufacturerID); 

      return(String)DB.GetData(sql.ToString(), new[] { id }); 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
    } 

는 또한 테스트로 returnValue.DbType = DbType.String;를 설정하고이 여전히 정수를 반환했습니다.

내가 성공적으로 GetData(...) 방법을 사용하는 경우의 예는 다음과 같습니다

public static Int32 GetMonitoredCount() 
    { 
     try 
     { 
      String GetMonitoredCount = "SELECT COUNT(*) FROM Devices WHERE Monitored = 1 "; 

      return (Int32)DB.GetData(GetMonitoredCount, null); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

내가 그것을 부울 비트를 반환 할 수 있지만 내 쿼리가 제대로 나는 가정 한 것 실행으로 1없는 0을 반환 생각했다.

정수가 반환되는 이유는 무엇입니까? 내 패턴을 사용하여 문자열을 반환하려면 어떻게해야합니까?

답변

4

ReturnValue 항상 int를 반환합니다. 이것은 의도적으로 설계된 동작입니다. 대신이 전체 블록의

object result = null; 
SqlParameter returnValue = new SqlParameter("ReturnValue", result); 
returnValue.Direction = ParameterDirection.ReturnValue; 
command.Parameters.Add(returnValue); 

connection.Open(); 
command.ExecuteScalar(); 
result = command.Parameters["ReturnValue"].Value; 

connection.Open(); 
object result = command.ExecuteScalar(); 

을 시도 이것은 당신의 SQL 문

방법 ExecuteScalar 자체가 값을 반환 할 수 당신에게 실제 결과를 반환합니다 - 먼저 반환 열을 반환하며 쿼리에서 단일 값을 반환 할 때 이상적입니다.

관련 문제