Vb.net 获取访问器上的委托引发不兼容的类型错误
我已经研究了一段时间,但似乎无法使它工作 有一个大的sql表(许多列、行),我必须在excel中获取值,我使用LINQ to sql获取每一行,使用反射按名称迭代每一列,并将其写入相应的excel列。看到反射很慢,我尝试将委托分配给每个属性,并(通过字典)将其映射到列名,以避免开销 问题是: 在VB.NET中,当我尝试将委托分配给属性的GetMethod(例如整数)时,如下所示:Vb.net 获取访问器上的委托引发不兼容的类型错误,vb.net,delegates,Vb.net,Delegates,我已经研究了一段时间,但似乎无法使它工作 有一个大的sql表(许多列、行),我必须在excel中获取值,我使用LINQ to sql获取每一行,使用反射按名称迭代每一列,并将其写入相应的excel列。看到反射很慢,我尝试将委托分配给每个属性,并(通过字典)将其映射到列名,以避免开销 问题是: 在VB.NET中,当我尝试将委托分配给属性的GetMethod(例如整数)时,如下所示: Dim prop = GetType(TestSQLClass).GetProperty("SomeColumn"
Dim prop = GetType(TestSQLClass).GetProperty("SomeColumn")
Dim del As [Delegate] = [Delegate].CreateDelegate(GetType(Func(Of Integer)), prop.GetMethod)
我收到这个错误:
无法绑定到目标方法,因为其签名或安全性
透明度与委托类型的透明度不兼容
我遗漏了什么?谢谢你的提问。我觉得有一个安瓦尔会很好,在C#找到了一个。请参阅模块底部的属性。我喜欢数据类型扩展的想法。它甚至出现在智能感知中。大约1500条记录,包含10列,大部分为文本,在3秒钟内完成
Imports Microsoft.Office.Interop
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Module DataTableToExcel
' Export DataTable into an excel file with field names in the header line
' - Save excel file without ever making it visible if filepath Is given
' - Don't save excel file, just make it visible if no filepath is given
Private excelApp As Excel.Application
Private workSheet As Excel.Worksheet
<Extension>
Public Sub ExportToExcel(tbl As DataTable, excelFilePath As String)
Dim sw As New Stopwatch
sw.Start()
Try
If IsNothing(tbl) OrElse tbl.Columns.Count = 0 Then
Throw New Exception("ExportToExcel: Null or empty input table!")
End If
' load excel, And create a New workbook
excelApp = New Excel.Application()
excelApp.Workbooks.Add()
' single worksheet
workSheet = CType(excelApp.ActiveSheet, Excel.Worksheet)
' column headings
For i = 0 To tbl.Columns.Count - 1
workSheet.Cells(1, i + 1) = tbl.Columns(i).ColumnName
Next
Dim CellArray(tbl.Rows.Count - 1, tbl.Columns.Count - 1) As Object
'rows
For i = 0 To tbl.Rows.Count - 1
'to do: Format DateTime values before printing
For j = 0 To tbl.Columns.Count - 1
CellArray(i, j) = tbl.Rows(i)(j)
Next
Next
workSheet.Range((workSheet.Cells(2, 1)), (workSheet.Cells(tbl.Rows.Count + 1, tbl.Columns.Count))).Value = CellArray
' check file path
If Not String.IsNullOrEmpty(excelFilePath) Then
Try
excelApp.DisplayAlerts = False
workSheet.SaveAs(excelFilePath)
MessageBox.Show("Excel file saved!")
Catch ex As Exception
Throw New Exception("ExportToExcel: Excel file could not be saved! Check filepath." & ex.Message)
End Try
Else ' no file path Is given
excelApp.Visible = True
End If
Catch ex As Exception
Throw New Exception("ExportToExcel:" & ex.Message)
Finally
excelApp.Workbooks.Close()
excelApp.Quit()
Marshal.ReleaseComObject(workSheet)
Marshal.ReleaseComObject(excelApp.Workbooks)
Marshal.ReleaseComObject(excelApp)
End Try
sw.Stop()
Debug.Print(sw.ElapsedMilliseconds.ToString)
End Sub
'contributed by tuncalik; https://stackoverflow.com/questions/8207869/how-to-export-datatable-to-excel
'speed improvement by Tomasz Wiśniewski
'Releasing objects provided by GrammatonCleric
End Module
Imports System.Data.SqlClient
Public Class TestDataTableToExcel
Private dt As New DataTable
Private Sub btnCreateExcelFile_Click(sender As Object, e As EventArgs) Handles btnCreateExcelFile.Click
dt.ExportToExcel("Coffee.xlsx")
End Sub
Private Sub btnCreateDataTable_Click(sender As Object, e As EventArgs) Handles btnCreateDataTable.Click
Using cn As New SqlConnection(My.Settings.CoffeeConnectionString)
Using cmd As New SqlCommand("Select * From Coffees;", cn)
cn.Open()
Using dr As SqlDataReader = cmd.ExecuteReader
dt.Load(dr)
End Using
End Using
End Using
End Sub
End Class
导入Microsoft.Office.Interop
导入System.Runtime.CompilerServices
导入System.Runtime.InteropServices
模块DataTableToExcel
'将DataTable导出到一个excel文件中,标题行中有字段名
'-保存excel文件,如果给定了filepath,则不使其可见
“-不要保存excel文件,如果没有提供文件路径,只需使其可见即可
作为Excel.Application的私有excelApp
专用工作表格式为Excel。工作表
公共子ExportToExcel(tbl作为数据表,excelFilePath作为字符串)
将sw调暗为新秒表
sw.Start()
尝试
如果为Nothing(tbl)或LSE tbl.Columns.Count=0,则
抛出新异常(“ExportToExcel:Null或空输入表!”)
如果结束
'加载excel并创建新工作簿
excelApp=新建Excel.Application()
excelApp.Workbooks.Add()
“单一工作表
工作表=CType(excelApp.ActiveSheet,Excel.workSheet)
'列标题
对于i=0到tbl.Columns.Count-1
工作表.Cells(1,i+1)=tbl.Columns(i).ColumnName
下一个
将光线(tbl.Rows.Count-1、tbl.Columns.Count-1)作为对象
“行
对于i=0到tbl.Rows.Count-1
'要做的事情:打印前格式化日期时间值
对于j=0到tbl.Columns.Count-1
射线(i,j)=待测行(i)(j)
下一个
下一个
workSheet.Range((workSheet.Cells(2,1)),(workSheet.Cells(tbl.Rows.Count+1,tbl.Columns.Count)))。Value=0
'检查文件路径
如果不是String.IsNullOrEmpty(excelFilePath),则
尝试
excelApp.DisplayAlerts=False
工作表.另存为(excelFilePath)
MessageBox.Show(“Excel文件已保存!”)
特例
引发新异常(“ExportToExcel:Excel文件无法保存!请检查文件路径。”&ex.Message)
结束尝试
Else'没有给出文件路径
excelApp.Visible=True
如果结束
特例
抛出新异常(“ExportToExcel:&ex.Message”)
最后
excelApp.Workbooks.Close()的
excelApp.Quit()
Marshal.ReleaseComObject(工作表)
Marshal.ReleaseComObject(Excel应用程序工作簿)
Marshal.ReleaseComObject(excelApp)
结束尝试
sw.Stop()
Debug.Print(sw.elapsedmillesons.ToString)
端接头
"通卡利克贡献,;https://stackoverflow.com/questions/8207869/how-to-export-datatable-to-excel
“托马斯维尼夫斯基的速度提升”
“释放牧师提供的物品
端模块
导入System.Data.SqlClient
公共类TestDataTableToExcel
私有dt作为新数据表
私有子btnCreateExcelFile_Click(发件人作为对象,e作为事件参数)处理btnCreateExcelFile。单击
dt.ExportToExcel(“Coffee.xlsx”)
端接头
私有子btnCreateDataTable\单击(发送者作为对象,e作为事件参数)处理btnCreateDataTable。单击
将cn用作新的SqlConnection(My.Settings.CoffeeConnectionString)
使用cmd作为新的SqlCommand(“从咖啡中选择*”,cn)
cn.Open()
使用dr作为SqlDataReader=cmd.ExecuteReader
dt.负载(dr)
终端使用
终端使用
终端使用
端接头
末级
哦,对不起,忘了提一下,我正试图在Linq to SQL中执行此操作。它是一个自动生成的类,包含表中的每一列。我试图为类中每个属性的get访问器分配一个委托,以避免反射的GetProperty()太糟糕。Linq位于ADO.net之上,所以它的速度一定要慢一点。使用datareader和datatable,您可以获得excel文件的标题和所有数据。谢谢!!他是个救命恩人!我在尝试将方法参数类型作为delgate类型传递时遇到了困难,因此如果它是Int32属性,我将使用CreateDelegate(GetType(Func(Int32))创建委托,该委托适用于常规方法,但不适用于GetMethod Of properties。诀窍是传递类类型,就像这个CreateDelegate(GetType(Func))一样(属于第32类)