Vb.net 在同一ADO.NET ExecuteReader调用中更新和选择

Vb.net 在同一ADO.NET ExecuteReader调用中更新和选择,vb.net,tsql,transactions,ado.net,Vb.net,Tsql,Transactions,Ado.net,我正在使用我继承的其他人的代码,我需要一个健全的检查 在下面的SQL中,似乎没有运行update语句,只有select语句。我想知道这是否与交易有关?我在其他地方写过类似的代码,效果很好。同样的模式在继承的代码中被重复,所以没有一个可以工作,但它以前似乎可以工作 这段代码的目的是从平面文件源中引入数据,对其进行清理,并最终将其放入具有适当数据类型的表中进行报告。要进行清理,它会将其放入包含所有varchar列的临时表中 无论如何,为什么这些更新语句没有任何效果 Dim oConn As New

我正在使用我继承的其他人的代码,我需要一个健全的检查

在下面的SQL中,似乎没有运行update语句,只有select语句。我想知道这是否与交易有关?我在其他地方写过类似的代码,效果很好。同样的模式在继承的代码中被重复,所以没有一个可以工作,但它以前似乎可以工作

这段代码的目的是从平面文件源中引入数据,对其进行清理,并最终将其放入具有适当数据类型的表中进行报告。要进行清理,它会将其放入包含所有varchar列的临时表中

无论如何,为什么这些更新语句没有任何效果

Dim oConn As New SqlConnection(ProgConnString)
Dim oTrans As SqlTransaction
oConn.Open()
oTrans = oConn.BeginTransaction()

'Create the temp staging table
Dim strTempTableName As String = CreateTempTable(oConn, oTrans, oDataTable)

'Write the passed DataTable to the temp staging table
Dim copier As New SqlBulkCopy(oConn, SqlBulkCopyOptions.Default, oTrans)
copier.DestinationTableName = strTempTableName
copier.BulkCopyTimeout = 30
copier.WriteToServer(oDataTable)
copier.Close()

'This is the update statement that does not run
Dim strSQL As String = String.Empty
strSQL &= " UPDATE " & strTempTableName
strSQL &= " set [MyCol] = REPLACE([MyCol], '$', '') "
strSQL &= ", [MyCol2] = REPLACE([MyCol2], '$', '') "
strSQL &= ", [MyCol3] = REPLACE([MyCol3], '$', '') "

'[ some other update statements that also do not run... ]

' If I throw this in the mix, the update commands run
'Using oCmd1 As New SqlCommand(strSQL, oConn, oTrans)
'    oCmd1.ExecuteNonQuery()
'End Using
'strSQL = ""

'This is where we pull back the result. It should have all the above
' fixes from the update statements but it doesn't
strSQL &= " SELECT * FROM " & strTempTableName

Dim oCmd As New SqlCommand(strSQL, oConn, oTrans)
Dim oDataReader As SqlDataReader = oCmd.ExecuteReader
Dim resultDataTable As New DataTable
resultDataTable.Load(oDataReader)

'Drop temp table
strSQL = ""
strSQL &= vbNewLine & "IF OBJECT_ID('tempdb.." & strTempTableName & "') IS NOT NULL DROP TABLE " & strTempTableName
oCmd = New SqlCommand()
oCmd.Connection = oConn
oCmd.Transaction = oTrans
oCmd.CommandType = CommandType.Text
oCmd.CommandText = strSQL
oCmd.ExecuteNonQuery()

oTrans.Commit()

'Use the results
SomeFunctionWhatever(resultDataTable)
现在,如果我在选择之前使用一个
ExecuteNonQuery()
将其拆分,就可以了


是什么导致
Update
命令被忽略的,是事务吗?您可以在同一个
ExecuteReader()
调用中执行
Update
Select
,对吗?

事务是否提交过?如果是这样的话,你就没有表现出来。嗯,说得好。我更新了代码。看起来事务在select调用后被提交。可能根本不应该出现在交易中。但是,既然create temp table和bulk copy调用也都在事务中,为什么更新调用不起作用呢?如果您连续多次调用
resultDataTable.Load(oDataReader)
,它会得到结果吗?我不希望该命令生成多个结果集,但如果它生成多个结果集,
DataTable.Load
将一次只填充一个结果集。或者,您可以使用
数据集
,一次获取所有数据集。只需加载一个数据集。不管怎样,它都会加载。问题是数据集从未通过更新查询应用任何更改。您是否可以尝试oTrans=oConn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted)或者?