我有一个存储过程。其输入参数之一是期待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