Wednesday, February 15, 2006

Slow DataReader

I’m working on an app that has to iterate through hundreds of thousands of records in a SQL database. Since VB.NET isn’t my strongest skill, and is required by the organization paying me to write it, I decided to look for suggestions on how exactly to do it. I initially thought I’d need to use a Do While Loop. I Googled for an example and found an article by Microsoft that seemed to have a good way to iterate through the records. It works great, as long as speed isn’t a priority. If you need speed, try a DO WHILE Loop. In my testing I found that it’s about 10x faster than the For Next loop. The sample code below may have some formatting issues due to text wrapping. Also I left out the declarations. Here’s the sample code I used to test the For Next loop: objSQLCmd = New SqlCommand("SELECT [Territory], [Company],” & _ “[Policyno], [Module], [Covatot], [CovctotS], [CovdtotS], [CovetotS],” & _ “[Yearbuilt], [Consttype], [Stories], [retrofit], [Covaded], [Term],” & _ “[TermS], [poltype1] FROM [DataBaseName]", objSQLConn) objSQLConn.Open() objSQLRdr = objSQLCmd.ExecuteReader While objSQLRdr.Read() Dim i As New Integer For i = 0 To objSQLRdr.FieldCount - 1 varTPErr = System.DateTime.Now.ToString("HH:mm:ss.ffff", Nothing) & _ "Testme" & " " varKeyCompany = objSQLRdr("Company") varKeyPolicyno = objSQLRdr("Policyno") varKeyModule = objSQLRdr("Module") 'begin Write objSQLCmdW = New SqlCommand("UPDATE “ & _ “[DataBaseName] SET [TerrErr] = @varTPErr” & _ “WHERE [Company] = @Company AND [Policyno] = @Policyno” & _ “AND [Module] = @Module", objSQLConnW) objSQLCmdW.Parameters.Add("@varTPErr", varTPErr) objSQLCmdW.Parameters.Add("@Company", varKeyCompany) objSQLCmdW.Parameters.Add("@Policyno", varKeyPolicyno) objSQLCmdW.Parameters.Add("@Module", varKeyModule) objSQLCmdW.Connection.Open() objSQLCmdW.ExecuteNonQuery() objSQLCmdW.Connection.Close() 'end Write Next End While objSQLRdr.Close() objSQLConn.Close() Here’s the sample code I used to test the Do While Loop: objSQLCmd = New SqlCommand("SELECT [Territory], [Company], [Policyno], [Module], [Covatot], [CovctotS], [CovdtotS], [CovetotS], [Yearbuilt], [Consttype], [Stories], [retrofit], [Covaded], [Term], [TermS], [poltype1] FROM [DataBaseName]", objSQLConn) objSQLConn.Open() objSQLRdr = objSQLCmd.ExecuteReader If objSQLRdr.HasRows Then Do While objSQLRdr.Read() varTrace = varTrace + 1 varTPErr = System.DateTime.Now.ToString("HH:mm:ss.ffff", Nothing) & " Testme" & " " & varTrace varKeyCompany = objSQLRdr("Company") varKeyPolicyno = objSQLRdr("Policyno") varKeyModule = objSQLRdr("Module") 'begin Write objSQLCmdW = New SqlCommand("UPDATE [DataBaseName] SET [TerrErr] = @varTPErr WHERE [Company] = @Company AND [Policyno] = @Policyno AND [Module] = @Module", objSQLConnW) objSQLCmdW.Parameters.Add("@varTPErr", varTPErr) objSQLCmdW.Parameters.Add("@Company", varKeyCompany) objSQLCmdW.Parameters.Add("@Policyno", varKeyPolicyno) objSQLCmdW.Parameters.Add("@Module", varKeyModule) objSQLCmdW.Connection.Open() objSQLCmdW.ExecuteNonQuery() objSQLCmdW.Connection.Close() 'end Write Loop Else Console.WriteLine("No rows returned.") End If objSQLRdr.Close() objSQLConn.Close()

0 Comments:

Post a Comment

Links to this post:

Create a Link

<< Home