2012-02-25 2 views
1

이 SqlParameter 목록에 개체를 할당하고 SqlCommand를 실행하려고하지만 개체 중 하나가 SqlDbType으로 변환 될 수 없다는 예외를 throw합니다. 가급적 이러한 객체를 매개 변수 컬렉션 목록에 추가하기 전에 처리해야합니다. 그렇다면 매개 변수 목록에 추가되는 값이 올바른지 여부를 확인하는 방법은 무엇입니까? 어떤 속성을 확인해야합니까?값이 SqlDbType과 호환되는지 여부를 확인하거나 확인하는 방법?

bool Submit(Progs progs, CommandType commandType, string commandText) 
{ 
    try 
    { 
     List<SqlParameter> paramCollection = new List<SqlParameter>(); 
     foreach(Prog p in progs) 
     { 
      SqlParameter spTemp = new SqlParameter { ParameterName = p.Name , Value = p.Value}; 
      paramCollection.Add(spTemp); 
      using (SqlConnection con = GetConnection()) 
      { 
       SqlCommand cmd = new SqlCommand { CommandType = commandType, CommandText = commandText, Connection = con }; 
       con.Open(); 
       cmd.Parameters.AddRange(paramCollection); // Exception is thrown from this line 
       cmd.ExecuteNonQuery(); 
      } 
      return true; 
     } 
     catch(Exception exc) 
     { 
      return false; 
     } 
    } 

예외가 thown 말한다 : 에 매핑이 개체 유형 sol2.CodeBase.BL.Letter [] 알려진 관리 공급자에 대한 기본 유형에서 존재하지 않는

여기 내 코드입니다.

PS : SqlParameter에는 런타임시 표시 (예, 그것은 paramAter 아니라 매개 변수의) ParamaterIsSqlType라고의에 대한 속성이 있습니다 (즉, 나는 다음 줄에 중단 점과 spTemp을 검사 할 때)와 인 항상 거짓으로 설정? 어떤 종류의 속성, 그래서 런타임에만 나타납니다 ??? 또한이 "ParamaterIsSqlType"값이 의미하는 바는 무엇입니까?

+0

이 속성은 보지도 않고 그것을 사용 예,이 맞춤법이 틀린 것 할 수 있지만, 따라서, 비 공개 [고정되지 않습니다] (http://connect.microsoft.com/VisualStudio/feedback/details/90483/the-word-parameter-is-misspelled-in-the-paramaterissqltype-flag-in-the-non-public-members-of-system -data-sqlclient-sql 매개 변수). –

+0

'param '이란 무엇입니까? 선언 된 곳은 어디입니까? 또한 연결을 두 번 열면 [InvalidOperationException] (http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx)가 발생합니다. –

+0

예, 타이핑 실수였습니다. 지금 고쳐졌습니다. 이제 변환이 가능한지 확인 하시겠습니까? 또한,이 paramaterIsSqlType이 나타내는 것은 무엇입니까 (왜 항상 거짓입니까? 아니면 사실일까요?). – MrClan

답변

0

Do 무엇을 SqlParameterwould do to infer conversionType ~ SqlDbType 명시 적으로 설정하지 않은 경우. 따라서 프레임 워크에 사용할 수있는 속성이나 메서드가 (아직) 없습니다.

System.Type type = p.Value.GetType(); 
var isConvertible = IsConvertibleToSqlDbType(type); 
if(!isConvertible){ 
    //call your custom ToSqlType-method 
} 

다음 방법은 SqlParemeter'sprivate void InferSqlType (object value)에서 직접 파생 :

public static bool IsConvertibleToSqlDbType(Type type) 
{ 
    switch(type.FullName) { 
     case "System.Int64": 
     case "System.Data.SqlTypes.SqlInt64": 
      //SetSqlDbType (SqlDbType.BigInt); 
      return true; 
     case "System.Boolean": 
     case "System.Data.SqlTypes.SqlBoolean": 
      //SetSqlDbType (SqlDbType.Bit); 
      return true; 
     case "System.String": 
     case "System.Data.SqlTypes.SqlString": 
      //SetSqlDbType (SqlDbType.NVarChar); 
      return true; 
     case "System.DateTime": 
     case "System.Data.SqlTypes.SqlDateTime": 
      //SetSqlDbType (SqlDbType.DateTime); 
      return true; 
     case "System.Decimal": 
     case "System.Data.SqlTypes.SqlDecimal": 
      //SetSqlDbType (SqlDbType.Decimal); 
      return true; 
     case "System.Double": 
     case "System.Data.SqlTypes.SqlDouble": 
      //SetSqlDbType (SqlDbType.Float); 
      return true; 
     case "System.Byte[]": 
     case "System.Data.SqlTypes.SqlBinary": 
      //SetSqlDbType (SqlDbType.VarBinary); 
      return true; 
     case "System.Byte": 
     case "System.Data.SqlTypes.SqlByte": 
      //SetSqlDbType (SqlDbType.TinyInt); 
      return true; 
     case "System.Int32": 
     case "System.Data.SqlTypes.SqlInt32": 
      //SetSqlDbType (SqlDbType.Int); 
      return true; 
     case "System.Single": 
     case "System.Data.SqlTypes.Single": 
      //SetSqlDbType (SqlDbType.Real); 
      return true; 
     case "System.Int16": 
     case "System.Data.SqlTypes.SqlInt16": 
      //SetSqlDbType (SqlDbType.SmallInt); 
      return true; 
     case "System.Guid": 
     case "System.Data.SqlTypes.SqlGuid": 
      //SetSqlDbType (SqlDbType.UniqueIdentifier); 
      return true; 
     case "System.Money": 
     case "System.SmallMoney": 
     case "System.Data.SqlTypes.SqlMoney": 
      //SetSqlDbType (SqlDbType.Money); 
      return true; 
     case "System.Object": 
      //SetSqlDbType (SqlDbType.Variant); 
      return true; 
     default: 
      return false; 
    } 
} 
+0

어때? ...* 수정 된 코드 * : SqlParameter spTemp = 새 SqlParameter {ParameterName = p.Name, 값 = p.Value}; 시도 { SqlDbType sqlType = spTemp.SqlDbType; } catch { spTemp.Value = spTemp.Value.ToSqlType(); } paramCollection.Add (spTemp); – MrClan