c# - commandtext 参数在执行时更改类型
问题描述
在 ms-sql-server 上执行命令文本时,我的 c# 应用程序出现问题。这是我使用的功能:
public T ExecuteScalar<T>(string commandText, IDbDataParameter[] parameters)
{
T result_value = default(T);
using (var connection = this.CreateConnection())
{
connection.Open();
using (var transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
using (var command = connection.CreateCommand())
{
command.Transaction = transaction;
command.CommandText = commandText;
command.CommandTimeout = this.CommandTimeOut;
if (parameters != null)
{
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
}
}
object result = command.ExecuteScalar(); //Error is thrown here!
if (result is DBNull || result == null)
{
result_value = default(T);
}
else
{
Type type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
if (type.IsEnum)
{
if (Enum.IsDefined(type, Int32.Parse(result.ToString())))
{
result_value =(T)Enum.Parse(type, result.ToString());
}
}
else
{
result_value = (T)Convert.ChangeType(result, type);
}
}
}
transaction.Commit();
}
}
return result_value;
}
命令文本如下所示:
"insert into tbl_Person (Vorname,Nachname,Strasse,HausNr,PLZ,Ort) output inserted.id values (@Vorname,@Nachname,@Strasse,@HausNr,@PLZ,@Ort)"
检查我的命令文本对象的参数属性指出,HausNr参数具有以下值:
- 数据库类型:字符串
- sql-db 类型:NVarChar
- sql 值:{13/5}
- 值:“13/5”
所以HausNr参数应该是一个字符串吧?但是在执行命令时,会抛出以下错误:
"Fehler beim Konvertieren des nvarchar-Werts \"15/3\" in den int-Datentyp。"
无法将 nvarchar 值 \"15/3\" 转换为 int 数据类型
看起来他正在尝试将HausNr参数值转换为整数值。为什么会这样?
解决方案
错误消息表明数据库驱动程序尝试将您的字符串值转换为整数值。原因是 HausNr 列是数据库中的整数。
因此,请仔细检查您的数据库架构并将 HausNr 更改为 NVarChar。
推荐阅读
- php - PHP preg_replace:替换字符串中出现在最后一个带空格的连字符之前的所有连字符
- angular - Angular 8 P-dialog - ipad - 响应问题
- javascript - 是否可以使用自定义组件或任何其他方式自定义 ng2-smart-table 的列标题?
- latex - R Markdown公式不编织
- reactjs - 找不到模块“graceful-fs”发生在 npm ci 但不是 npm install (使用 maven 插件)
- xpath - 使用 XPATH 提取不是 ID 或 CLASS 的 div 元素的值
- python - 按成员值从python枚举中选择
- powershell - Powershell复选框,将选中的项目放在顶部
- django-rest-framework - 在 django REST 中自定义显示的字段
- .net-core - 如何在 .NET Core 中设置 NamedPipeServerStream 的 PipeSecurity