C# - Implementing Transaction Processing To Persist Application Data
May 27, 2011
Let's say an application needs to persist mostly immutable data. Let's say the application's data files can grow fairly large. How would you implement a simple transaction processing so that changes are either successfully committed or rolled back?
The only requirement is to use built-in .Net libraries. (no databases, no third party libraries)
Here's my current solution. The data file will have three main sections: (1) header, (2) data, (3) index. For now, the header section simply contains an offset to the start of the index section. The data section will store mostly immutable data. The index section will contain serialized objects with enough information to access the data section.
When the application starts, it only needs to deserialize objects from index section. Anything from the data section can be fetched as needed. As the application gets ready to write changes, it makes a temporary copy of the original header and index sections. These would be small relative to the data section. New data would then be appended to the original data section. Once all data has been written, in memory objects would be serialized to the end of the file to become the new index section.
If all this goes without a hitch, the temporary file can be deleted. If something goes wrong, the temporary file can be used to restore the data file to its original state.
Will this work or is there a more elegant approach?
I'm using an Entity Framework context, and sometimes would like to create a transaction so that the client can do multiple changes and then commit/rollback them all together.However, if many changes were made, and SaveChanges() was called multiple times, after which a rollback is called, entities that were commited already, will remain the way they were commited, and would not roll back.Here's how my transaction-relative functions look like:
Public Sub BeginTransaction() Dim context = HttpContext.Current.GetObjectContext() If Not context.Connection.State = ConnectionState.Open Then context.Connection.Open() End If
[Code]...
Not only does the test fail, but it also leave the ObjectContext in an unstable mode, because it still has invalid changes in it.
I need some general advice about using ListView. The program was originally written in VB2002, but now it's running in VB2008.The results of my program would typically be a ListView of 30 lines by 8 columns. I need to be able to save this data so that it persists after I close the program. There will never be a need to manipulate the data, so I'm looking for something simple. (There will be a need to print it.) I'm presuming that I need to link to a database to save the data. Correct? If so, can I use the one in Microsoft Works (which I already have), or do I need to get Microsoft Access, or is there some other better (simpler?) alternative?
I get this error at the Commit of a transaction in a desktop application:
This OleDbTransaction has completed; it is no longer usable.
Other posts I have seen with similar error suggests this can occur if it takes a long time, or contains large amounts of data. This is not the case here.Logging tells me it takes 140 ms from Begin to Commit and about 10 commands executed inside the transaction.It is using an Oracle database.This class is a simplified version of my database class:
Class MyDatabase Private mConnection AS OleDbConnection Private mTransaction AS OleDbTransaction
[code]....
Is it not allowed to run a select inside a transaction like this? Or can it be done by running the transaction in a specific isolation level (I see that the BeginTransaction method has an optional parameter for doing this) ? ..Or some other sollution..? In my case, it was not a problem to move the select to run before the transaction started, but what if you need to run selects that must run inside the transaction?
I've seen plenty of examples of transactions in the actual store procedure's SQL. But I'm wanting to do the transaction and keep track of it in code. I tried this but it says that my insertcommand's transaction object is null. How can I fix this?
vb Dim conn As SqlConnection = DBConnections.SQLServerConnection conn.Open() Dim params(1) As SqlParameter
Is it possible to automatically insert a Code Snippet when an interface is implemented? If so, how do you do it? I am looking for something similar to when you implement IDispoable in VB.[code]This will be used by web forms when transfering parameters from one page to the next using Server.Transfer
Error : Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction. The transaction property of the command has not been initialized..
This one causes the error: Dim oOperation As COperationOutputTypeBS oOperation = COperationOutputTypeBS.GetOperationOutputType(txtOperationCode.Text)
GOCR is a common Optical Character Recognition software that can be implemented into almost any programming language. You must convert the image you wish to convert into a PNM file and then proceed to call the executable OCR file. I cannot find any conversion methods for Visual Basic, nor am I quite sure how to send the file to the program and retrieve the text. Has anyone ever worked with GOCR or happen to know anything above?
As many of you know, GOCR is a common Optical Character Recognition software that can be implemented into almost any programming language.You must convert the image you wish to convert into a PNM file and then proceed to call the executable OCR fileI cannot find any conversion methods for Visual Basic, nor am I quite sure how to send the file to the program and retrieve the text. Has anyone ever worked with GOCR or happen to know anything above?
I just learned some basics of multi threading in VB.net recently as I came across processing a large List of records and inserting them into SQL database one by one.
I have code look like this:
Private Sub btnLoadNow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadNow.Click
Dim autoLoad1 As New Thread(AddressOf AutoLoad) autoLoad1.Start()
[CODE]...
Itemlists is a global lists i retrieved from database, everything looks fine to me but when i run this program, I found that the threads are inserting one records 9 times into the database(I have 9 threads in total), which makes me think that maybe i need to specifically assign 1/9 of a list to each thread? Is there another way to do it which doesn't require the splitting of the list, if not , how do i split it then assign?
I've decided to make my own simple scripting language parser. I've created about 50% of it and it works great! I need to implement "functions". What ever program uses my parser needs to be able to connect functions to my parser for customization. I've implemented "Lua", a scripting language, in a vb.net application of mine. To connect functions to the Lua Parser it used reflections.I need to be able to (by only knowing the name of the function and its structure) call a function connected through the implementing application.
I am currently developing a chat application and am trying to include:
Various states, like MSN does, available, busy and away.If the user doesn't touch the keyboard for one minute, the state of the user isto be changed into Away.Or something similar to these.I also need the program to be able to play a sound while running.
Im a college student and this is my first programming class, i am having extremely diffcult time with arrays and sequential file processing. Im not asking for the whole program, just something to get me started and hints along as i progress with it. Please help me get started on my program, its due in 2 days.
Here are the requirements....
1. The program must input any number of individual�s last and first names using two separate textboxes. 2. The array of names must be sorted by the last name using a bubble sort. You must code the sort. 3. The program must be able to recall the names from the file and add to the existing list of names so that more names can be added to, sorted, and written back to the file in sorted order. 4. Sort in ascending order: A to Z 5. All names must be displayed in a listbox in sorted order when the user wishes to see them. 6. In the listbox the last and first names must be separated by a comma and a space. Example: Smith, Mary 7. The user must be able to search for a name in the array, using the binary search algorithm. You must code the search. 8. Do not use module-level variables. Instead you may choose to use Static. 9. The program must be designed using Visual Basic 2008
am developing an application where a client send data to server (socket Programing) and the server recevices it and shows it to the user through a list view but the client can send the data any time they want and it should show on the list view automatically... So i have put a timer and in tick event i have written the code like this the below code is working fine in onload event but then only once the client can send the data to the server.
I am creating an application for learning purposes. I am using this: process.start("iexplore.exe"); That is working fine. However I would like to be able to tell when the page has been loaded all the way. I would like to know how to tell if the application is done processing or not, that is my main goal. If using the webbrowser control you can use the webbrowser documentcompleted event.
If vb application (windows form app) is calling a store procedure and it takes 5-10 mins to SP to finish and meanwhile the application is (forced to) close,
what will happend at the SQL side?
Will the proc completely run even though the app is not running anymore?
Below is my code to delete the transaction. It suppose to delete the data once the transaction but the data remain there....I don't find there is a problem with the code but some how it doesn't work.
What I would like to do is read this data in as fast as possible either line by line and processing the data as I go by line. Or read the whole lot in and THEN process it, which woulkd be the fastest ? I used to do this in Excel but want to transfer it to VB and don't know really how to get started I have the following but would like to know how to get the columns into a named array and then how to itterate through array.
Dim myLines() As String = IO.File.ReadAllLines("C:SYNC_DATA�0 - LGW�5 - Archived�0 - IST Logs2008istlog20090224.txt")
I have code in an ASP.NET form that needs to, depending on user entry create messages in the database. We are speaking of potentially thousands of db entries. How do I protect against deadlocks, I mean apart from using Transactions and setting IsolationLevel to Serializable, as well as using WITH(NOLOCK) statement on my select statements since I don't mind a dirty read.
I have a datagridview in a form that is dynamically bound to a datatable. When the user clicks a button I update certian columns of the current row with code like this:
Dim i As Integer = myDataGridView.CurrentRow.Index Me.myDataGridView.Item("closed", i).Value = DBNull.Value
I'm working with Visual Basic 2008 Express. My application opens with the Terms screen, a form that asks the user to declare his acceptance of certain terms and conditions or to decline. If he accepts, the app opens the main screen, giving him access to all the app's facilities. If he declines, the app gives him a message and then closes. Whether he chooses to accept or decline, the app puts his decision in My.Settings so that it can be used next time the app is opened. In this way he is presented with the Terms screen on the next opening if he declined on the last run. But if he accepted on the last run, he is presented with the main screen on his next opening.
All works fine when I do a debug run. But when I build and publish the app onto my desktop it opens with the Main screen instead of the Terms screen.
I need to very quickly write an exe system on a laptop where when the laptops are connected to the network they read a database table and store the data locally, so staff can use the laptop while they roam.The laptops have quite small capacity and the company would prefer not to use SQL Express or Access.
My question is, can the data initially be downloaded into the exe application via a dataadapter and dataset, and will that dataset the retain the downloaded data, or will I need to ensure the dataset is written to an XML file and then loaded/unloaded each time the laptop application is started while the staff are travelling ?
I am a web developer who now has to change a Windows service. I never worked on a Windows service before. I have a several programs that can run within this service. I want to persist a value of a variable from program to program.
I'm having some problems in persisting the viewstate on postback for a Control (vb.net)
here's some code i've put in my control[code]...
I'm setting EnableViewState = "true" everywhere i can, but still no result. Do i really need to set those properties here. (ViewStateMode and EnableViewState) If not, where should i handle this and what is the difference between those properties?
I have been searching for quite a while now but i am unable to find the answer to the following. I am storing a key pair in Windows Store, and recently started receiving the "Keyset does not exist" error. Investigating a bit further i found out it could be two things, 1 - The private key is not stored with the persist key set attribute (X509KeyStorageFlags.PersistKeySet) and 2 - access rights to the key. I have tried both 1 and 2 with no success on one machine (in my machine it works apparently). The strange thing is that when i look into MicrosoftCryptoRSAMachineKeys (and S-1-5-18) the key remains there but only for a period of time then it is deleted which means that it is not persisting.
//If decoded then save as RSACryptoServiceProvider newCert.PrivateKey = DecodePrivateKey(privateKeyFile, pkPassword) if (newCert.PrivateKey == null)
[Code]....
I have just found out today that since i am doing this through a WCF service, the application pool is deleting the private key when it reaches its idle time limit so i am completely sure that it is the application pool the one disposing of the private key which causes the key to be deleted from the MicrosoftCryptoRSAMachineKeys and S-1-5-18 folders. Today i left a test running where i disabled Idle time shut down from the application pool bu i am still not sure if the private key will stop persisting with a restart or something like that?
Would anybody know how to make the application pool stop deleting my private keys?