C#:将字符串转换为DBType.AnsiStringFixedLength
我有一个存储过程。它的一个输入参数应为char(8)。我尝试将字符串“AAA”转换为这个特定的参数类型,即DBType.AnsiStringFixedLengthC#:将字符串转换为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(字符
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();
}
}