Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with.
    
        
            
                
                    
                        
                            
                                | Author | 
                                
                                 Topic  | 
                             
                            
                                    | 
                                         AceWare 
                                        Starting Member 
                                         
                                        
                                        2 Posts  | 
                                        
                                        
                                            
                                            
                                             Posted - 2012-09-24 : 20:30:25
                                            
  | 
                                             
                                            
                                            | Multiposted on social.technet.microsoft.com/Forums/en-US/sqlnetfxThe code below is very preliminary test code to see if we can use clr sql to update grain handler records. It is a simple test at this stage to see if I can loop thru approx 5000 records updating an arbitary field for each record. Currently the batch pricing process via a front end is taking 45 minutes. It has a lot of fairly convoluted logic that does not suit being written in T-SQL. I will use stored procedures with T-SQL at the beginning and end of the process where it suits. Once in production, the batch process is intended to be run stand alone by a single user - if it experiences locking issues from other users of the system - I just intend to abort the process and issue a message to the user that other user must not be using the system. The scale of the operation allows this to be feasible - ie I do not intend to cope with record locks beyond warning other users to get out of the system. The problem I am experiencing is infinite time out on updates for the same specific set of records. I am the only user of the test database being used. The same set of records experiences a time out in the update each time. (We do not experience any record lock problems when using the existing front end batch code.) At the end of the reader loop I can specifically update the problem records - the timeout problem only occurs when attempting to update within the loop. You will see lines of code where I successfully update the problem records one by one. I am guessing that I must be locking multiple records within a page block (don't really know what I am talking about here) Here are the counter numbers and id fields of the problem records: (this is what comes back from the SqlContext.Pipe.Send(strError); line of code, slightly tweaked up for readability) Recd# Id ----- ------------ 706   002-21078503 718   002-21259566 1133   003-00452040 1149   002-19605577 1263   00000433 2117   002-21193694 2133   002-21236494 2507   002-21190216 2540   002-21281006 3634   002-21203655 3913   002-21140890 and here is the code: I admit I am being naughty using SQL login to sa - will fix soon. Timeout is set to 1 just to get a quick turn around everytime I try a new idea - I have set it to 300 with no improvement. I have tried using a separate connection for the ExecuteNonQuery command but this interestingly enough gave me more than twice as many problem records. I have tried creating and disposing cmdUpdate every time around the reader loop - with no improvement. using System; using System.Data; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; using Microsoft.CSharp; using System.Data.SqlClient; using System.Configuration; public class TransformLoopProc {     [Microsoft.SqlServer.Server.SqlProcedure]     public static void TransLoop(DateTime dteProcDate, String strSQLServer, String strInitialCatalog)     {                int intRecordCount;         IDataRecord Record;         string strIDNumber;         string strConnection;         string strError = "";           strConnection = "Data Source=" + strSQLServer + ";Initial Catalog=" + strInitialCatalog + ";Persist Security Info=True;User ID=sa;Password=xxxx;MultipleActiveResultSets=True ";         SqlConnection connection = new SqlConnection(strConnection);                 using (connection)         {                   connection.Open();             SqlCommand CmdReadLoop = new SqlCommand("ace_ToBeTransformed", connection);             CmdReadLoop.CommandTimeout = 0;             SqlDataReader reader = CmdReadLoop.ExecuteReader();             SqlCommand cmdUpdate = new SqlCommand();             cmdUpdate.CommandTimeout = 1;             cmdUpdate.Connection = connection;             cmdUpdate.CommandText = "UPDATE tblAQImport SET Paddock = @Paddock WHERE IDNumber = @IDNumber;";             using (reader)             {                 intRecordCount = 0;                 while (reader.Read())                 {                                         intRecordCount ++;                     Record = (IDataRecord)reader;                     strIDNumber = Convert.ToString(Record["IDNumber"]);                     cmdUpdate.Parameters.AddWithValue("@Paddock", "test9");                     cmdUpdate.Parameters.Add("@IDNumber", SqlDbType.VarChar);                     cmdUpdate.Parameters["@IDNumber"].Value = strIDNumber;                         try                         {                             cmdUpdate.ExecuteNonQuery();                         }                         catch (Exception e)                         {                             strError = strError + intRecordCount.ToString() + "  " + strIDNumber  + "\n";                         }                     cmdUpdate.Parameters.Clear();                                     }             }             reader.Close();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21078503'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21259566'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '003-00452040'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-19605577'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '00000433'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21193694'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21236494'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21190216'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21281006'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21203655'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.CommandText = @"update tblAQImport set Paddock = 'test9' where IDNumber = '002-21140890'";             cmdUpdate.ExecuteNonQuery();             cmdUpdate.Dispose();         }         connection.Close();         SqlContext.Pipe.Send(strError);     } } Any suggestions very gratefully received. Tony Eptonrosie | 
                                             
                                         
                                     | 
                             
       
                            
                       
                          
                            
                                    | 
                                     AceWare 
                                    Starting Member 
                                     
                                    
                                    2 Posts  | 
                                    
                                      
                                        
                                          
                                           
                                            Posted - 2012-09-27 : 00:24:27
                                          
  | 
                                         
                                        
                                          | It's Fixed ! Following Mart's advice - I removed the isnull() function in the datasource (not shown anywhere here) and this halved the number of errors. From examining the locks via various queries I gleaned from web searches I also realised that the outer read loop and the inner update were somehow blocking each other and this made me think that somehow the read and update processes were not staying synchronised. The datasource had no sort order and I have seen this cause random results in the past. On a hunch and with no hard logic, I added a sort order on IDnumber and this fixed the problem. If anyone can theorise how the lack of a sort order caused this problem I would love to hear. Many thanks Tonyrosie  | 
                                         
                                        
                                            | 
                                         
                                       
                                     | 
                                   
                            
                            
                                | 
                                    
                                      
                                     
                                    
                                 | 
                             
                         
                     | 
                 
             
         |