.net 正确使用数据表
我有一个按需运行的powershell进程,它通过web服务调用从应用程序收集所有“请求历史记录”日志。结果请求被强制转换为对象,并使NoteProperty值(属性值对)每周以一个大的列表数组(通常为1400项)结束 我想做的是为了历史目的存储所有这些请求,这样应用程序就不会自己清除它们。因此,我在数据库上创建了一个简单的表,该表存储了每个请求的所有属性值对,而这些请求在我新创建的数据库中并不存在 然后,我在powershell脚本中设置到MSSQL服务器的OleDB连接,并从表中选择所有记录以填充DataTable(我对OleDB或DataTables不太熟悉)。之后,我循环遍历列表数组中的每个项,以验证它在DataTable中不存在。对于每个不存在的记录,我在DataTable中添加一个具有属性值对的新行。从这里开始,我假设命令生成器有助于Insert语句,因此我不必检查每个属性值是否为null或空白,甚至不必编写查询。最后,我用新添加的数据表“更新”OleDBAdapter 当这个过程工作时,我意识到它所做的是从数据库中提取所有数据,然后与我的列表数组进行比较,并重新提交新添加的记录。数据库越大,所需时间越长。是否有任何方法可以在不必编写任何SQL语句的情况下快速高效地执行此操作?我喜欢CommandBuilder处理数据表的方式 下面是在获取所有“请求历史记录”对象后更新数据库所调用的函数.net 正确使用数据表,.net,powershell,datatable,oledb,.net,Powershell,Datatable,Oledb,我有一个按需运行的powershell进程,它通过web服务调用从应用程序收集所有“请求历史记录”日志。结果请求被强制转换为对象,并使NoteProperty值(属性值对)每周以一个大的列表数组(通常为1400项)结束 我想做的是为了历史目的存储所有这些请求,这样应用程序就不会自己清除它们。因此,我在数据库上创建了一个简单的表,该表存储了每个请求的所有属性值对,而这些请求在我新创建的数据库中并不存在 然后,我在powershell脚本中设置到MSSQL服务器的OleDB连接,并从表中选择所有记录
function UpdateDatabase([Parameter(Mandatory=$true)] $allRequests)
{
$objOleDbConnection = New-Object "System.Data.OleDb.OleDbConnection"
$objOleDbCommand = New-Object "System.Data.OleDb.OleDbCommand"
$objOleDbAdapter = New-Object "System.Data.OleDb.OleDbDataAdapter"
$objDataTable = New-Object "System.Data.DataTable"
$objOleDbConnection.ConnectionString = "Provider=SQLNCLI10;Server=SERVER;Database=DB1;Trusted_Connection=yes;"
$objOleDbConnection.Open()
$objOleDbCommand.Connection = $objOleDbConnection
$objOleDbCommand.CommandText = "SELECT * FROM dbo.RequestLog"
##set the Adapter object and command builder
$objOleDbAdapter.SelectCommand = $objOleDbCommand
$objOleDbCommandBuilder = New-Object "System.Data.OleDb.OleDbCommandBuilder"
$objOleDbCommandBuilder.DataAdapter = $objOleDbAdapter
##fill the objDataTable object with the results
[void] $objOleDbAdapter.Fill($objDataTable)
[void] $objOleDbAdapter.FillSchema($objDataTable,[System.Data.SchemaType]::Source)
#store all the primary keys in a list for kicking out dups
$sql_id = @()
$objDataTable.Rows | foreach { $sql_id += $_.PKID}
#####
#loop through all the requests
trap {
"Error: $($i)"
}
$i = 0
$total = $allRequests.count
foreach ($request in $allRequests)
{
$i++
write-progress -activity "Filling DataTable" -status "% Complete: $($i/$total*100)" -PercentComplete ($i/$total*100)
#check to see if entry already exists in our table (by primary key)
if (!($sql_id -contains $request.PKID.Value))
{
#shouldn't have to do this but i noticed sometimes requests are duplicate in the list? (probably restarted the script and caught some old requests
$sql_id += $request.PKID.Value
$row = $objDataTable.Rows.Add($request.PKID.Value)
#go through all the attributes from the request and add them to the table
$list = get-member -in $request | Where-Object { $_.MemberType -eq "NoteProperty" }
foreach ($attr in $list)
{
if ($request.($attr.name) -ne $null)
{
$row.($attr.name) = $request.($attr.name)
}
}
} else {
#PKID already in DB
}
}
#update the database with our new records
$objOleDbAdapter.Update($objDataTable)
## close the connection
$objOleDbConnection.Close()
}
您需要编写一点T-SQL代码来提高流程的效率。您需要将新行发送到SQL Server,以便在SQL Server上进行处理。一种解决方案是使用表值参数,它允许您将数据表传递给SQL Server。我在这里举了一个例子:
您需要编写一点T-SQL代码来提高流程的效率。您需要将新行发送到SQL Server,以便在SQL Server上进行处理。一种解决方案是使用表值参数,它允许您将数据表传递给SQL Server。我在这里举了一个例子:
谢谢@chad,我将研究使用表值参数,尽管我不确定我是否有权创建存储过程。谢谢@chad,我将研究使用表值参数,尽管我不确定我是否有权创建存储过程