1

この SqlParameter のリストにオブジェクトを割り当ててから SqlCommand を実行しようとしていますが、オブジェクトの 1 つを 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;
        }
    }

スローされる例外は次のとおりです。 オブジェクト型 sol2.CodeBase.BL.Letter[] から既知のマネージド プロバイダー ネイティブ型へのマッピングは存在しません。

PS : ParamaterIsSqlType と呼ばれるSqlParameterのプロパティがあります(はい、paramAter であり、paramEter ではありません)。これは実行時 (つまり、次の行にブレークポイントがある spTemp を検査するとき) にのみ表示され、常に false に設定されますか? これはどのような種類のプロパティなので、実行時にのみ表示されますか??? また、この「ParamaterIsSqlType」が示す値は何ですか?

4

1 に答える 1

0

明示的に設定されていない場合、からへのSqlParameter 変換を推測するために行うことを行います。つまり、フレームワークで使用できるプロパティやメソッドは (まだ) ありません。TypeSqlDbType

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

次のメソッドは、から直接派生しSqlParemeter's private 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;
    }
}
于 2012-02-25T22:36:52.313 に答える