如何知道/检查一个值是否与SqlDbType兼容?
我将对象分配给此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”表示什么值?
做什么SqlParameter
would do to infer conversion从Type
到SqlDbType
如果它没有明确设置。因此,不,框架中没有可用的属性或方法。
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;
}
}
这个怎么样? ...*修改后的代码*: 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
此属性是不公开的,因此你不能看也不能使用它,是的,它的拼写错误,但[不固定] (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
什么是'param'?它在哪里宣布?您还打开连接两次,应该引发[InvalidOperationException](http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx)。 – 2012-02-25 20:54:23
雅,这是一个打字错误,现在修复。所以,现在,你会如何建议检查转换是否可能?另外,这个paramaterIsSqlType表示什么(为什么它总是错误的,或者当它是真的)? – MrClan 2012-02-25 21:06:52