2010-02-22 124 views
1

我有一個存儲過程。其輸入參數之一是期待char(8)。我嘗試將字符串「AAA」轉換爲這個特定的參數類型,這是一個DBType.AnsiStringFixedLength。C#:將字符串轉換爲DBType.AnsiStringFixedLength

object v = Convert.ChangeType("AAA", param.DbType.GetTypeCode()); 
// param is AnsiStringFixedLength 

但是,我得到的只是一個例外:輸入字符串的格式不正確。 而堆棧跟蹤說:在System.Number.StringToNumber(字符串str的NumberStyles選項,NumberBuffer &數的NumberFormatInfo信息,布爾parseDecimal)[...]

爲什麼System.Convert試圖將一個字符串轉換成一個數字,即使prodecure的參數期望char(8)?我該如何解決這個問題?我不想用一個巨大的開關情況,映射所有SQL類型CLR類型...

編輯: 這是有問題的代碼:(A泛型方法調用任何MS SQL存儲過程)

using (SqlConnection conn = new SqlConnection(this.config.ConnectionString)) 
{ 
    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = this.config.StoredProcedureName; 

     conn.Open(); 
     SqlCommandBuilder.DeriveParameters(cmd); 

     foreach (SqlParameter param in cmd.Parameters) 
     { 
      if (param.Direction == ParameterDirection.Input || 
       param.Direction == ParameterDirection.InputOutput) 
      { 
       try 
       { 
        string rawParam = param.ParameterName.Replace("@", ""); 
        if (this.config.Parameters.ContainsKey(rawParam)) 
        { 
         try 
         { 
          param.Value = Convert.ChangeType(this.config.Parameters[rawParam], 
           param.DbType.GetTypeCode()); 
         } 
         catch(Exception oops) 
         { 
          throw new Exception(string.Format("Could not convert to '{0}'.", param.DbType), oops); 
         } 
        } 
        else 
         throw new ArgumentException("parameter's not available"); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 
      } 
     } 
     cmd.ExecuteNonQuery(); 
    } 
} 

實際參數值由this.config.Parameters提供 - 它們都是字符串。我遍歷SqlCommand的參數列表並相應地設置它們。在這裏需要將字符串值轉換爲參數的Sql類型,並且據我所知,Sql類型由param.DBType提供。

回答

2

你似乎混淆了一些東西,或者我沒有得到你想要做的事情。 DbType(枚舉)繼承Enum並實現IConvertible - >您可以撥打GetTypeCode()。但是 - 你現在調用Enum.GetTypeCode(),它返回底層類型。如果您沒有指定它(並且DbType沒有),則任何Enum都支持int

你想用代碼解決什麼問題?爲什麼想要更改字符串的類型,如果參數是一個字符串(儘管具有固定長度)?


再看看這個問題,看起來更奇怪。你有一個對象v(可能是爲了價值?) - 你對這個類型有什麼關心?

object v1 = "Foo";

object v1 = 42;

是什麼,你有什麼區別?我想你想把值傳遞給別的東西,但是 - 如果你只是將值作爲object來引用,你可能仍然需要將其轉換。

請更新您的問題並解釋您真正想要做什麼,您期望獲得什麼。


關於評論:

我使用Convert.ChangeType(對象 值,類型碼TYPECODE),所以它不是真的 轉換成枚舉/ INT。在 至少這是我以爲......

見上文:DbType.GetTypeCode()是不是你想要的。嘗試一下,給我一個懷疑的好處:你期待從DbType.AnsiStringFixedLength.GetTypeCode()得到什麼?如果你嘗試它,實際的結果是什麼?

我們您的代碼:您嘗試將SqlParameter.Value屬性設置爲「正確」的類型。兩件事:根據文檔,你可能想要設置SqlParameter.SqlValue,這是根據文檔使用SQL類型的值。另一方面,SqlParameter.Value是使用CLR類型的值,並允許推斷DbType和SqlValue。旁註,實現細節:SqlParameter.SqlValue二傳手只是調用的SqlParameter.Value再次二傳手...

我會想到的是,ADO.NET的東西轉換自身的價值,如果在所有可能的。如果沒有跳過這個籃圈,你會得到什麼錯誤?

+0

我正在使用Convert.ChangeType(對象值,TypeCode typeCode),所以它並不真正轉換爲Enum/int。至少這就是我認爲的...... – user264833 2010-02-22 15:13:50

+0

沒有。我無法相信它。我甚至沒有嘗試。它在沒有改變類型的情況下工作得很好。我剛剛從這個內存很久以前,當我有麻煩的設置SqlCommand參數,而沒有將對象轉換爲適當的SQL類型... 在任何情況下,非常感謝!我將使用SqlParameter.SqlValue。我知道,下一次,我會RTFM的;-) 編輯:對不起,我不能投票給你的答案,沒有足夠的聲望點:D – user264833 2010-02-22 16:27:18