我有一個存儲過程。其輸入參數之一是期待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提供。
我正在使用Convert.ChangeType(對象值,TypeCode typeCode),所以它並不真正轉換爲Enum/int。至少這就是我認爲的...... – user264833 2010-02-22 15:13:50
沒有。我無法相信它。我甚至沒有嘗試。它在沒有改變類型的情況下工作得很好。我剛剛從這個內存很久以前,當我有麻煩的設置SqlCommand參數,而沒有將對象轉換爲適當的SQL類型... 在任何情況下,非常感謝!我將使用SqlParameter.SqlValue。我知道,下一次,我會RTFM的;-) 編輯:對不起,我不能投票給你的答案,沒有足夠的聲望點:D – user264833 2010-02-22 16:27:18