C#:将字符串转换为DBType.AnsiStringFixedLength

C#:将字符串转换为DBType.AnsiStringFixedLength,c#,sql,C#,Sql,我有一个存储过程。它的一个输入参数应为char(8)。我尝试将字符串“AAA”转换为这个特定的参数类型,即DBType.AnsiStringFixedLength object v = Convert.ChangeType("AAA", param.DbType.GetTypeCode()); // param is AnsiStringFixedLength 然而,我得到的只是一个例外:输入字符串的格式不正确。 堆栈跟踪显示:在System.Number.StringToNumber(字符

我有一个存储过程。它的一个输入参数应为char(8)。我尝试将字符串“AAA”转换为这个特定的参数类型,即DBType.AnsiStringFixedLength

object v = Convert.ChangeType("AAA", param.DbType.GetTypeCode()); 
// param is AnsiStringFixedLength
然而,我得到的只是一个例外:输入字符串的格式不正确。 堆栈跟踪显示:在System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、NumberFormatInfo信息、布尔parseDecimal)[……]

为什么System.Convert试图将字符串转换为数字,即使prodecure的参数需要字符(8)?我如何解决这个问题?我不想使用一个巨大的开关案例将所有SQL类型映射到CLR类型

编辑: 这就是问题中的代码:(调用任何MS SQL存储过程的通用方法)


实际参数值由this.config.Parameters提供-它们都是字符串。我遍历SqlCommand的参数列表并相应地设置它们。这里需要将字符串值转换为参数的Sql类型,就我所见,Sql类型由param.DBType提供

你似乎把这里的一些事情搞混了,或者我不明白你想做什么。(枚举)继承
Enum
,并实现
IConvertible
->您可以调用
GetTypeCode()
。但是-您现在调用的是
Enum.GetTypeCode()
,它返回基础类型。如果您没有指定它(并且
DbType
没有指定),则任何
Enum
都由
int
支持

你到底想用代码解决什么问题?如果参数是字符串(尽管长度固定),为什么要更改字符串的类型


再多看看这个问题,似乎就更奇怪了。您有一个对象v(可能是值?)-您对类型关心什么

objectv1=“Foo”

objectv1=42

你有什么不同?我猜您希望将值传递给其他对象,但是-如果您仅将值引用为
object
,您可能仍然需要强制转换它

请更新您的问题,并解释您真正想要做什么,您期望获得什么


关于评论:

我正在使用Convert.ChangeType(对象 值,类型代码,所以它不是 真正转换为枚举/整数。在 至少我是这么想的

请参见上文:
DbType.GetTypeCode()
不是您想要的。试试看,让我有点疑惑:您希望从
DbType.AnsiStringFixedLength.GetTypeCode()中得到什么?如果你尝试一下,实际结果是什么

现在来看看您的代码:您尝试将属性设置为“正确”类型。两件事:根据文档,您可能需要设置,即根据文档使用SQL类型的值,另一方面,是使用CLR类型的值,允许推断DbType和SqlValue。旁注,实现细节:setter只是再次调用的setter


如果可能的话,我希望ADO.NET能够自行转换值。如果不跳过这一环,您会遇到什么错误?

我使用的是Convert.ChangeType(对象值、类型代码、类型代码),因此它并没有真正转换为Enum/int。至少我是这么想的……一点也没有。真不敢相信。我甚至都没试过。它在不改变类型的情况下工作得非常好。很久以前我就有了这样的记忆,当时我在设置SqlCommand参数时遇到了麻烦,而没有将对象强制转换为适当的sql类型。。。无论如何,非常感谢!我将使用SqlParameter.SqlValue。我知道,下一次,我会用RTFM播放;-)编辑:对不起,我不能投票支持你的答案,没有足够的声誉点数:D
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();
    }
}