退出块支架。选择

时间:2017-05-19 12:38:25

标签: c# vb.net datatable escaping

我正在尝试使用DataTable函数

Select中过滤数据
Dim dr() As DataRow = Nothing
Dim DtDataSource As DataTable

'value is populated here in DataTable (12,000 Records)

dr = DtDataSource.Select("[Name] like '[PAPER]*'") 'Gives Error

我尝试从DataTable获取数据的最后一行会抛出错误,因为我使用了大括号' [' ' ]'

C#中,我们可以使用以下代码来解决它

dr = DtDataSource.Select("[Name] like '\[PAPER\]*' ESCAPE '\\'");

但如果我在这里使用相同的概念,则会出现以下错误

  

语法错误:' ESCAPE'之后缺少操作数操作

现在无论如何我可以从DataTable中获取数据,该数据以短语 [PAPER] 开头?

2 个答案:

答案 0 :(得分:1)

你应该以这种方式逃避方括号

 dr = DtDataSource.Select("[Name] like '[[]PAPER[]]%'") 

另一种方法是使用LINQ从DataTable中提取信息

 rows = DtDataSource.AsEnumerable().
                     Where(Function(row) row.Field(OfType String)("Name").
                     StartsWith("[PAPER]")

 .... work with the datarow collection
 For Each row as DataRow in rows
    .....
 Next

答案 1 :(得分:0)

你注意到你的DataRow是一个数据行数组吗?你声明:Dim dr() As DataRow = Nothing而不是Dim dr As DataRow = Nothing(只是确定)。
如果你需要包含字符串[Paper]的多行,请使用第三个例子并将所有行提取到一个新的DataTable。如果您只需要一个不同的行,请使用第一个\第二个示例。您可以使用linq \ lambda expiration

获得相同的结果
Public Sub ex2()
    Dim dr As DataRow = Nothing
    Dim DtDataSource As DataTable

    ' 1. example with linq'
    dr = (From row In DtDataSource.AsEnumerable()
          Where row.Field(Of String)("Name").Contains("[PAPER]") Select row).FirstOrDefault()
    ' 2. example with lambda expiration'    
    dr = DtDataSource.AsEnumerable().Where(Function(x) x.Field(Of String)("Name").Contains("[PAPER]")).Select(Function(y) y).FirstOrDefault()

    ' 3. but if you want all the rows that containes [Paper] you can do it like that:'
    Dim tempDt As DataTable = DtDataSource.AsEnumerable().Where(Function(x) x.Field(Of String)("Name").Contains("[PAPER]")).Select(Function(y) y).CopyToDataTable()
End Sub