2012-02-25 12 views
1

このSqlParameterのリストにオブジェクトを割り当ててから、SqlCommandを実行しようとしていますが、オブジェクトの1つがSqlDbTypeに変換できないという例外がスローされます。私は、これらのオブジェクトをパラメータコレクションリストに追加する前に、そのようなオブジェクトを処理することをお勧めします。では、パラメータリストに追加された値が適切かどうかをチェックするにはどうすればよいですか?どのようなプロパティをチェックする必要がありますか?値が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を検査する場合)としています常にfalseに設定されていますか?これはどんな種類のプロパティなので、実行時にのみ表示されますか?また、この "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-sqlparameter)を使用します。 –

+0

'param'とは何ですか?それはどこに宣言されていますか?また、[InvalidOperationException](http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx)が発生する必要があります接続を2回開いています。 –

+0

ya、これは入力ミスで、今修正されました。それでは、変換が可能かどうかを確認するにはどうすればよいですか?また、このparamaterIsSqlTypeは何を示していますか(なぜそれは常にfalseか、それが真となるか)? – MrClan

答えて

0

Do何かSqlParameterwould do to infer conversionTypeSqlDbType明示的に設定されていない場合は、だから、いいえ、フレームワークで利用可能なプロパティやメソッドはありません(まだ)。

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、Value = p.Value}; try { SqlDbType sqlType = spTemp.SqlDbType; } catch { spTemp.Value = spTemp.Value.ToSqlType(); } paramCollection.Add(spTemp); – MrClan

関連する問題