如何解决具有错误字节数组的SQLCommand对象
我的.NET应用程序使用SQLCommand执行查询和DB SP。 在一个这样的SP中,它还返回SQL'timestamp',并作为字节数组读取到应用程序中。该字节数组不正确,导致DB稍后在工作流程中引发错误。
代码如下:
public void ExecCommand(string strCommand,CommandType CommandType,IParameters IParameters,ref IRows[] IRowsArr)
{
SqlDataReader dataReader = null;
if (this.m_sqlTransaction == null) //if not in transaction
OpenConnection();
this.MapTosqlParameters(IParameters,dbCommand);
SqlCommand dbCommand = this.CreateCommand();
dbCommand.CommandType = CommandType;
dbCommand.CommandText = Normalize(strCommand);
try
{
// Trace the sql Command string and its Execution Start Time
using (var sqlLogger = CreateSQLLogger(dbCommand))
{
dataReader = dbCommand.ExecuteReader();
}
}
catch (DbException ex)
{
LogError(ex);
throw;
}
}
private void MapTosqlParameters(IParameters Parameters,SqlCommand SqlCommand)
{
SqlParameter sqlParameter = null;
Object objValue;
Type Type;
TypeCode TypeCode;
SqlDbType SqlDbType;
// Convert Input Parameter to sql Type Parameter
SqlCommand.CommandText = Normalize(SqlCommand.CommandText);
if (Parameters != null)
{
foreach (IParameter Parameter in Parameters)
{
objValue = Parameter.objValue;
if (objValue is VMS.Varis.Common.Shared.IImage)
{
TypeCode = TypeCode.Object;
SqlDbType = SqlDbType.VarBinary;
objValue = ((IImage)objValue).GetJPG();
}
//Assign the Timestamp mapping here because typecode for timestamp is coming as byte[] as this can be used for anything .. Images,files etc..
else if (objValue != null &&
(objValue == VDBNullEq.HstryTimeStamp || objValue.GetType().Name == "Byte[]"))
//&& ((byte[])objValue).Length == 8))
{
TypeCode = TypeCode.Object;
SqlDbType = SqlDbType.Timestamp;
}
else
{
Type = (objValue != null ? objValue.GetType() : Parameter.Type);
TypeCode = System.Type.GetTypeCode(Type);
//For DataTable,m_parameterMaps does not return value as TypeCode does not contain equivalent value for SqlDbType.Structured.
SqlDbType = Type == (typeof(DataTable)) ? SqlDbType.Structured : m_parameterMaps.GetValue(TypeCode);
}
if (objValue != null && objValue != DBNull.Value && TypeCode == System.TypeCode.String)
{
objValue = Normalize(((string)objValue));
}
sqlParameter = SqlCommand.Parameters.Add(Parameter.strName,SqlDbType);
sqlParameter.Direction = Parameter.eParameterDirection;
sqlParameter.SourceColumn = Parameter.SourceColumn;
sqlParameter.SourceVersion = Parameter.SourceVersion;
if ((Parameter.eParameterDirection == ParameterDirection.Output) ||
(Parameter.eParameterDirection == ParameterDirection.InputOutput))
{
switch (SqlDbType)
{
case SqlDbType.NChar:
sqlParameter.Size = 4000;
break;
case SqlDbType.NVarChar:
sqlParameter.Size = 8000;
break;
}
}
//NullConversionHandler does not return value for TypeCode DataTable so set value explicitely for
if (SqlDbType == SqlDbType.Structured)
{
sqlParameter.Value = objValue ?? DBNull.Value;
}
else
{
sqlParameter.Value = (objValue == null || Compare(m_nullConversionHandler.GetNullValue(TypeCode),objValue)) ? DBNull.Value : objValue;
}
if (SqlDbType == SqlDbType.NChar && sqlParameter.Value == DBNull.Value)
{
sqlParameter.Value = string.Empty;
}
if (sqlParameter.Value is System.DateTime)
{
if (sqlParameter.Value != DBNull.Value)
{
if (((System.DateTime)sqlParameter.Value).Year > 9999 || ((System.DateTime)sqlParameter.Value).Year < 1900)
{
//throw new Exception(VDBResStrings.GetString("msgDateTimeValueOutOfBounds"));
// The error should be thrown only if the date year is less than 1900 and the time component is not 12:00 AM
if (((System.DateTime)sqlParameter.Value).TimeOfDay != TimeSpan.Zero)
{
throw new ArgumentException(VDBResStrings.GetString("msgDateTimeValueOutOfBounds"));
}
}
}
}
}
}
}
工作流程: -创建新记录,添加一些参数。它首先要求保存信息。 -信息被保存,并且DB SP返回时间戳。 -此时间戳在.NET代码中转换为bye数组,此处字节数组错误 -添加一些其他参数并保存相同的记录。 .NET代码将同一个字节数组传递给具有时间戳检查的SP,从而导致不匹配并引发错误。
但是,遵循工作流程可以正常工作 -创建新记录,添加一些参数。它首先要求保存信息。 -保存信息并由DB SP返回时间戳。 -此时间戳在.NET代码中转换为bye数组,此处字节数组又一次出错。 -关闭记录并重新打开(这将导致调用另一个返回时间戳的SP)并添加一些新参数并保存。
注意:导致问题的相同工作流程在.NET Framework V4.7中工作正常,但在V4.8中失败
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。