2012-02-25 2 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 (да, это В параметре и не параметрической), который появляется только во время выполнения (то есть, когда я инспектировать 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). –

+0

ya, это была типичная ошибка, исправленная сейчас. Итак, как бы вы предложили проверить, возможно ли преобразование? Кроме того, что указывает этот параметр paramsIsSqlType (почему он всегда неверен или когда он будет правдой)? – MrClan

ответ

0

Сделайте то, что SqlParameterwould do to infer conversion от Type до 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 = new SqlParameter {ParameterName = p.Name, Value = p.Value}; try { SqlDbType sqlType = spTemp.SqlDbType; } catch { spTemp.Value = spTemp.Value.ToSqlType(); } paramCollection.Add (spTemp); – MrClan

Смежные вопросы