我正在做一个IS任务。我有一个名为SCB_ActualMIN
的flatfile列,其数据类型为string [DT_STR]
。我还有一个脚本组件将SCB_ActualMIN
列转换为数字数据类型。我的脚本组件中有这段代码
If Not Row.SCBActualDTime_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualDTime.Trim) Then
Dim dtDate As Date
If DateTime.TryParse(Row.SCBActualDTime.Trim, dtDate) Then
Row.OutPutColumn = dtDate
Else
'If column cannot be parsed
Row.OutPutColumn_IsNull = True
End If
Else
Row.OutPutColumn_IsNull = True
End If
'''''SCBActualDTime
If Not Row.SCBActualMIN_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then
Dim MIN As Integer
If Int32.TryParse(Row.SCBActualMIN.Trim, MIN) Then
Row.OutPut2Column = MIN
Else
'If column cannot be parsed
Row.OutPut2Column_IsNull = True
End If
Else
Row.OutPut2Column_IsNull = True
End If
正如您所看到的,string
到datetime
数据类型的转换是成功的。使用string
到integer
的相同代码时。即使我在行代码中有值Int32.TryParse(Row.SCBActualMIN.Trim, MIN)
,09764377211
也始终返回false。还有其他方法让我避免重复代码。
答案 0 :(得分:2)
if (!string.IsNullOrWhiteSpace(queryString))
{
queryString = queryString.Replace("\"", string.Empty);
flagedIssues =
flagedIssues.Where(
i =>
CleanHtml(i.Description).Contains(queryString) ||
i.IssueTagses.Any(t => t.Tag.Contains(queryString)) ||
i.Category.Description.Contains(queryString));
}
private string CleanHtml(string dirtyString)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(dirtyString);
return doc.DocumentNode.InnerText;
}
大于9764377211
,这是可以分配给2147483647
的最大值
尝试将值转换为Int32
或Int64
而非Double
Int32
OR
Dim MIN As Int64
If Int64.TryParse(Row.SCBActualMIN.Trim, MIN) Then
Row.OutPut2Column = MIN
Else
'If column cannot be parsed
Row.OutPut2Column_IsNull = True
End If
您无法避免重复,因为您必须使用自己的 Dim MIN As Double
If Double.TryParse(Row.SCBActualMIN.Trim, MIN) Then
Row.OutPut2Column = MIN
Else
'If column cannot be parsed
Row.OutPut2Column_IsNull = True
End If
属性来检查每列是否为null。您可以尝试通过创建函数来最小化代码。
答案 1 :(得分:2)
首先,像@Yahfoufi建议引发异常,因为值“9764377211大于2147483647,这是可以分配给Int32的最大值......”
您可以在此MSDN article中详细了解数据类型和相应的最大值。
Type Storage size Range
Int32 4 bytes -2,147,483,648 to 2,147,483,647
Int64 8 bytes Approximately -9.2E+18 to 9.2E+18
Double 8 bytes Approximate range is -1.79E+308 to 1.79E+308 with accuracy of about 15 digits. Can represent numbers as small as 1E-323.
Decimal 12 bytes Approximate range is -7.9E+28 to 7.9E+28 with accuracy of 28 digits. Can represent numbers as small as 1E-28.
...
您可以将此值分配给Int64
或Decimal
或Double
数据类型
优化代码
在这种情况下,您无法避免重复这些代码部分,因为使用了无法动态调用的独立属性:
检查输入列是空还是空
If Not Row.SCBActualMIN_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then
如果无法解析值或输入Null
或空
Null
分配给输出列
Row.OutPut2Column_IsNull = True
您可以修改代码以尽量减少行数,但我认为不会提高性能
假设这两列包含日期
Dim dtDate As Date
If Not Row.SCBActualDTime_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualDTime.Trim) AndAlso
DateTime.TryParse(Row.SCBActualDTime.Trim, dtDate)Then
Row.OutPutColumn = dtDate
Else
'If column cannot be parsed or it is null
Row.OutPutColumn_IsNull = True
End If
'Assuming that SCBActualMIN is a Date
If Not Row.SCBActualMIN_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) AndAlso
DateTime.TryParse(Row.SCBActualMIN.Trim, dtDate)Then
Row.OutPut2Column = dtDate
Else
'If column cannot be parsed
Row.OutPut2Column_IsNull = True
End If
如果性能良好或最佳,拥有大量代码行不是问题。同时最小化代码行数不一定会提高性能
SSIS,SQL,.Net数据类型的有用链接