当前位置: 首页 > 编程语言 > C#

带Nullable值的SqlParameter在ExecuteNonQuery时报错?Share

时间:2023-04-10 12:59:24 C#

SqlParameterwithNullablevalue在ExecuteNonQuery上给出错误?我有一个SQL查询,其参数在数据库(SqlServer)中可以为空。update方法工作正常,直到该用户在该字段中放置一个空白,这将为DataTime对象生成一个空值(此对象可以为null)。问题是当dbCommand.ExecuteNonQuery();.以下是我为该字段构建参数的方法:IDataParameterdbParam_au_id=newSqlParameter();dbParam_au_id.ParameterName="@birthday";dbParam_au_id.Value=生日;dbParam_au_id.DbType=DbType.DateTime;dbCommand.Parameters.Add(dbParam_au_id);我尝试将生日空值转换为DBNull.Value,如下所示:IDataParameterdbParam_au_id=newSqlParameter();dbParam_au_id.ParameterName="@birthday";dbParam_au_id.Value=生日??DBNull.Value;dbParam_au_id.DbType=DbType.DateTime;dbCommand.Parameters.Add(dbParam_au_id);但是这段代码无法编译,我收到错误:Error1Operator'??'不能应用于“System.DateTime?''System.DBNull'类型的操作数有什么想法吗?类型不兼容。尝试这样的事情:dbParam_au_id.Value=(object)birthday??DBNull.Value;如果第一次正确写入SqlParameter类...C#空值将作为DBNull.Value处理。这是直观的,因此当然将SqlParameter值设置为null在功能上等同于将其从SqlParameterCollection中删除。要纠正这个荒谬的API设计错误,请创建您自己的AddParameter方法(带有重载),该方法采用SqlParameterCollection、String(参数名称)和Object(参数值)。#region按名称/值添加。//////添加具有名称和值的输入参数。自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///要添加的参数的值。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,objectvalue){parameters.Add(newSqlParameter(name,value??DBNull.Value));}//////添加具有名称和值的参数。您指定输入/输出方向。自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///要添加的参数的值。如果为null,则会自动转换为DBNull.Value。///要添加的参数的ParameterDirection(输入、输出、输入/输出或返回值)。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,objectvalue,ParameterDirectiondirection){SqlParameterparameter=newSqlParameter(name,value??DBNull.Value);}parameter.Direction=方向;parameters.Add(参数);}#endregion#region按名称、类型和值添加。//////添加具有名称、类型和值的输入参数。自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///指定参数的SqlDbType。///要添加的参数的值。如果为null,则会自动转换为DBNull.Value。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,SqlDbTypetype,objectvalue){AddParameter(parameters,name,type,0,value??DBNull.Value,ParameterDirection.Input);}}//////添加具有名称、类型和值的参数。您指定输入/输出方向。奥特自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///指定参数的SqlDbType。///要添加的参数的值。如果为null,则会自动转换为DBNull.Value。///要添加的参数的ParameterDirection(输入、输出、输入/输出或返回值)。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,SqlDbTypetype,objectvalue,ParameterDirectiondirection){AddParameter(parameters,name,type,0,value??DBNull.Value,direction);}}#endregion#region按名称、类型、大小和值添加。//////添加具有名称、类型、大小和值的输入参数。自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///指定的SqlDbType参数。///为可变大小的参数类型指定参数的大小。设置为零以使用默认大小。///要添加的参数的值。如果为null,则会自动转换为DBNull.Value。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,SqlDbTypetype,intsize,objectvalue){AddParameter(parameters,name,type,size,value??DBNull.Value,ParameterDirection.Input);}//////添加具有名称、类型、大小和值的参数。您指定输入/输出方向。自动处理空对象值到DBNull.Value的转换。//////来自SqlCommand实例的SqlParameterCollection。///要添加的参数的名称。///指定参数的SqlDbType。///为可变大小的参数类型指定参数的大小。设置为零以使用默认大小。///要添加的参数的值。如果为空,则自动转换编辑为DBNull.Value。///要添加的参数的ParameterDirection(输入、输出、输入/输出或返回值)。privatestaticvoidAddParameter(SqlParameterCollectionparameters,stringname,SqlDbTypetype,intsize,objectvalue,ParameterDirectiondirection){SqlParameter参数;if(size如您所见,在方法(和重载)中,值已作为对象输入,我使用“value??DBNull.Value”语句来强制执行null=DBNull.Value规则现在,当您传递null对AddParameter方法没有值的对象引用或可空类型,您将获得预期的直观行为,其中将DBNull.Value传递给查询。我无法想象API实现的原因,因为如果我想忽略一个参数,我不添加它,然后将它的值设置为null。要么我不先添加它,要么我将它从SqlParameterCollection中删除。如果我添加一个参数,并设置它的值(即使设置为null),我希望它在查询中使用,我希望null代表一个空值。我听说他们出于性能原因没有以“正确”的方式实现它,但如前所述,这是荒谬的,因为调用SqlParameterCollection.AddWithValue方法无论如何都会将所有内容转换为对象,将没有值的Nullable实例转换为空对象是C#语言的固有部分,根本不会影响性能。微软应该解决这个问题。以上是C#学习教程:SqlParameterwithNullablevaluegiveserrorwhenExecuteNonQuery?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: