2012-02-25 41 views
1

我将对象分配给此SqlParameter列表,然后尝试执行SqlCommand,但它引发异常,表示其中一个对象无法转换为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的所谓ParamaterIsSqlType(是的,这paramAter而不是参数),其仅在运行时出现(即当我检查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)。 – 2012-02-25 20:48:42

+0

什么是'param'?它在哪里宣布?您还打开连接两次,应该引发[InvalidOperationException](http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx)。 – 2012-02-25 20:54:23

+0

雅,这是一个打字错误,现在修复。所以,现在,你会如何建议检查转换是否可能?另外,这个paramaterIsSqlType表示什么(为什么它总是错误的,或者当它是真的)? – MrClan 2012-02-25 21:06:52

回答

0

做什么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 = new SqlParameter {ParameterName = p.Name,Value = p.Value}; 尝试 SqlDbType sqlType = spTemp.SqlDbType; } catch { spTemp.Value = spTemp.Value.ToSqlType(); } paramCollection.Add(spTemp); – MrClan 2012-02-26 05:43:52

相关问题