|
What you need is a database transaction. This has nothing to do with .NET, however. For example, you may want to do the following things to the CurrentUsers table in the databse:
1. Check if there is a record with UserName field equals "John001".
2. If there is such a record, check if the value of the ExpirationDate field is less than today's date.
3. If yes, then delete this record from the CurrentUsers table and add a corresponding record to the ExpiredUsers table.
You can put all the above code into a database transaction so that it won't cause any problem if the same code is being executed from multiple threads/processes.
Again, this has nothing to do with .NET.
My articles and software tools
|
|
|
|
|
Hello,
In one of the apps I came across in a book Im reading, a form attaches itself to the SystemEvents.UserPreferenceChangedEvent. In the Dispose method of this form, it detaches itself.
My question is this: If the form is being disposed anyway, when you close it, why do you need to explicitly detach yourself from this event? I have never seen the need to detach events in the Dispose method before (for example, if the form is attached to the regular mouse events). What would happen if I didnt detach the form from the event?
Also, do controls automatically remove themselves form any events they are attached to when they are deleted/removed from the form?
Thanx for the help
-Flack
|
|
|
|
|
It is not necessary to remove an event handler. Typical cases for removing an event handler are when you want to stop handling events, like when you're updating something that would normally raise events and don't want notified while doing it (your object already knows it's changing something).
When you remove a control with event handlers from a form, it's handlers are not removed. The control is an object and is still alive after being removed from a form unless nothing else references it and the GC collects it.
Does it hurt to remove a handler from and event during disposal? Not in the sense that something will break - it's just extraneous instructions to execute.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I am trying to take a .pdf file and put it into a byte[]. Then send it through a webservice, and take that byte[] and create the same .pdf on the other end. Any suggestions??
|
|
|
|
|
As far as creating the PDF file, there are many libraries available (both free and commercial libraries) so you should try google.
As for serializing the PDF, you can do it the bad way to support older clients and save the PDF to a MemoryStream . From that you can get a (very large) byte[] array that you can marshal across machine boundaries to the web service. There you create another Stream (either a FileStream to create an actual file, or a MemoryStream , or any other binary stream class) and write the bytes from the request to the stream. The byte[] array is the file, so there's no conversion necessary.
Why is that a bad way? Well, a byte is 8 bits. If the XML Web Service uses ASCII encoding, then each character (since SOAP is a text format, not binary) is 8 bits. No harm there. Unfortunately for you, most XML Web Services use either UTF-8 or Unicode encodings. UTF-8 uses characters anywhere from 8 to 16 bits (1 to 2 bytes), where Unicode uses characters that are 16 bits or 32 bits. Now you're wasting a lot of bandwidth. And to serialize this document might also be a waste of time (in terms of CPU time, depending on the source of the file and how you serialize it).
Instead, download the Microsoft Web Service Enhancements[^] (WSE) and read Sending Files, Attachments, and SOAP Messages Via Direct Internet Message Encapsulation[^]. The DIME specification defines a contract whereby the XML Web Service can send and receive binary data before the SOAP header. This can significantly increase performance and is an industry standard (along with the other specifications covered by the WSE).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks I ended up getting it to work right before I looked back at the Forum!
|
|
|
|
|
BTW, I didn't explain something quite right. If you encode binary data as characters, it depends on the encoding you use how many bytes are required to represent a byte, plus the text encoding for how many bytes that representation requires.
As Daniel said, you could encode the file (actually, the byte[] array I mentioned) as base64. That's going to require less bytes than base16 (2 characters per byte, otherwise known as hexidecimal) but still more than a single byte. Layer on top of that the character encoding (for example, using hex encoding with a UCS-2 text encoding yields 4 bytes per source byte!), and you have a serious performance and bandwidth problem.
Be sure to check out that article on DIME. It's easy to implement (the WSE 2.0 SDK has a very simple example of all that's required) and worth the (little) effort.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
Hi, I have an asp.net app with a web form that contains a listbox. The app also contains a frameset, which is loaded by a Contents.htm file.
When the user chooses a number from the list box, I need to pass that number to the href element i.e
"a href="Mail[choosen number].aspx" etc." in the contents file.
E.g user chooses 3 from listbox, should pass 3 to contents.htm and place 3 in the href element...
So the page "a href="Mail3.aspx" etc." is called.
Hope I make sense!! Thanks.
|
|
|
|
|
This question is much better handled in the ASP.NET forum. Just because the code-behind is written in C# doesn't mean that the question has anything to do with C#.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I created a web control to display html files on my form. My idea was to click space bar and to go to next file (html, picture or movie) in the folder, but my form looses focus and doesn't pick up the keypress event. I turned on key preview and made a button which should get the focus after the web control displays what it is suppose to diplay. The problem I am having is that when I am playing a movie or a flash file, it won't transfer the focus to the button or to the form. But, if I make a messagebox right after I give button the focus, then the focus is set to the button. How can I fix this?
|
|
|
|
|
Are your waiting for the HTML document to completely load before you set the focus back to your button? Are you setting the focus inside the DocumentComplete event of the WebBrowser control?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I just tried setting the focus to a button in the DocumentComplete event so the form would be able to pick up the keypress event, but still doesn't work.
|
|
|
|
|
Given the limitations of comercial solutions, I'm writing a custom app installation utility. I'm writing it in a generic manner. However, the application I'm initially writing it for has a mixture of .NET and ASP 3.0/COM+ functionality. As such, I need to be able to:
- Create/Delete COM+ Applications and set properties.
- Register/Unregister COM+ components (NOT assemblies) in those applications and set properties.
I've written a class that successfully creates applications and adds components. However, using COMAdminCatalog.InstallComponent() to add components to the application adds exactly 18 entries to the registry. By contrast, simply registering a component and its type library using regsvr32 adds only 10.
My Issue: Using either COMAdminCatalog.Remove() or resvr32 /u doesn't remove ALL registry entries, but leaves 6 entries, all under HKLM\SOFTWARE\Microsoft\COM3\SelfReg. The entries left in there include a CLSID, ProgID and type library.
My Question: I've searched the .NET fx high and low and looked for options for interop, all to no avail. How do I programmatically remove ALL references of a COM+ DLL from the registry so as not to cause any potential conflicts (DLL hell) in future upgrades where binary compatibility is broken? Thanx!
Boyd Campbell
Systems Engineer
|
|
|
|
|
Is this for a managed service component, or a native COM+ server? For the former, you should be using regsvcs.exe, not regsvr32.exe (which leads me to believe this is a native COM+ server you're talking about since a .NET assembly doesn't export DllRegisterServer ). For the latter, you should ask in the COM forum, not the C# language forum.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Sorry...I thought I made it clear, though I should've used the word "unmanaged".
I am talking about a native COM+ server. However, I'm having to do it from managed code (C#), so I believe I'm in the proper messageboard context.
Here's a snippet I whipped up as an example of what I'm attempting to accomplish:
<snip>
public static void DeleteComServicesApp()
{
// Get the current catalog of applications.
COMAdminCatalog lobj_Catalog = new COMAdminCatalogClass();
COMAdminCatalogCollection lobj_Catalogs = (COMAdminCatalogCollection)
lobj_Catalog.GetCollection("Applications");
try
{
lobj_Catalogs.Populate();
// Try to find the applicable application.
if(lobj_Catalogs.Count > 0)
{
ICatalogObject lobj_AppToFind;
bool lb_Exists = false;
for(short i = 0; i < lobj_Catalogs.Count; i ++)
{
lobj_AppToFind = (ICatalogObject)lobj_Catalogs.get_Item(i);
if((string)lobj_AppToFind.get_Value("Name") == "MyCOMPlusApplicationToDelete")
{
/* The application was found. Delete it, thereby removing and unregistering
all unmanaged COM+ servers in the process. Though the application is
properly removed from the catalog, this is what I'm saying doesn't
fully unregister the servers. It removes many of the registry entries,
but not all.
*/
lobj_Catalogs.Remove(i);
lobj_Catalogs.SaveChanges();
lb_Exists = true;
break;
}
}
}
}
catch (MyCustomCatalogException cce)
.
.
.
</snip>
|
|
|
|
|
Again, this still really belongs in the COM forum. Despite the fact your using C# to write this, your simply marshaling calls to COM and, of course, the functionality is defined natively. The interop assembly you've created for the catalog manager is nothing more than an RCW.
I think the trick is figuring out what put those registry settings there. How exactly was the COM+ server registered? I wouldn't imagine those are chaced settings because the key is called "SelfReg". If the COM+ server was installed with a Windows Installer package, then you should actually interop the MSI typelib (or just P/Invoke the functions you need) to remove the feature (or the whole package). MSI will clean-up all settings it put there (unless you have some transitive condition or permanent flag enabled).
If it's anything like that, I can personally help you, but if it's questions about the COMAdminCatalog and related classes this would be more appropriately asked in the COM forum.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Ok...I'll make another post of the original message on the COM list.
FYI: The server was actually registered in another method using the COMAdminCatalog:
<snip>
lobj_Catalog.InstallComponent("MyCOMPlusApplication",
@"c:\myUnmanagedComSErver.dll", "", "");
</snip>
If you can point me in any direction or give any recommendations on how to create my own installation package, I'd appreciate it. If you have any opinions about InstallShield, Wise or any other third party tool, I'd appreciate that as well. We decided to go in-house because those tools don't handle some of the more complex issues concerning enterprise application installation (COM apps & servers & all related settings, MSMQ & settings, any other custom functional aspects of the install, etc.).
Thank you sir!
|
|
|
|
|
I've used both Wise and InstallShield since their initial Windows Installer builders (started with the Windows Installer beta) and prefer Wise. InstallShield took for ever to add direct MSI table manipulation, something I use a lot. They have it now, but only after several major versions. Considering the price and the user-friendliness, I choose Wise.
Frankly speaking, though, I typically alter MSI packages directly (using Wise, I do this before compiling). The interfaces are nice, but I'm an old hack and can usually do things faster myself.
COM+ server can be registered using Windows Installer via the Complus table. You can even use the crappy Windows Installer project with VS.NET and then hack this simple chance in the MSI after compiling using Orca (from the Windows Installer SDK, part of the Platform SDK).
Custom actions can acheive everything else, but if you don't need package management (because MSI is very good at that) and your internal solution works - good for you.
Since you are installing the component via the COMAdminCatalog , then it's obviously putting those settings there.
Just so you know, I have been working with OLE/COM for about 10 years now, so I'm no stranger, although I haven't gotten too deep into COM+. That being said, though, I think you might have better luck in the COM forum where there probably are people with COM+ experience.
However, following COM guidelines, binary compatibility should never be broken (when possible) for the same CLSID. That information - unless that ProgID is verion-dependent, shouldn't hurt anything so long as you take care (not that it'd take much effort) to maintain binary compatibility.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks for all your help Heath. Much appreciated. I posted the same question on the COM list late yesterday.
Our application relates to the Transportation industry. It's also a behemoth of an application with hundreds of thousands of lines of code in nearly every MS technology you can think of. Mix this in with the occasional Jr. programmer who is thrown to the wolves to a task and not very learned in thinking "outside the box", and you've got yourself a recipe for future changes that break BC. Very unfortunate, but we hit it about once a quarter.
Two more questions:
- Would you think purchasing Wise would bring me a faster result than building my own, even considering all the customization I'd have to do with the advanced nature of some of our installation as well as my learning curve in using the tool and a proprietary scripting language?
- In your experience, are there any limitations to using Wise that would be better served by building a custom application?
|
|
|
|
|
We have a large multi-tiered application with several hundred thousand lines of code as well using .NET (just about feature), COM, and even a little Java. The big difference is it's written almost entirely by Jr. programmers. Save me, my right-hand man, and the R&D director (I'm the technology director), everyone's pretty new at it. The app works, but it's bloated. Ick.
Wise is a good choice for writing MSI packages (and the proprietary scripting language is entirely optional; both Wise and InstallShield allow you to use their proprietary scripting languages for custom actions), but what you need to evaluate is whether Windows Installer is right for you.
Windows Installer is a complete package management system. It'd be really hard to describe all that Windows Installer does, so I'll direct you to an overview: http://msdn.microsoft.com/library/en-us/msi/setup/windows_installer_start_page.asp[^].
Basically, when you design installation packages you group things into features and components (a subset of features). Upgrades and patches are easy to make as well, and these can migrate feature states. When you install a package, information about it's features, components, directories, and upgrade codes are saved in the registry as well. This information can be queried using WMI even. It also features a transacted installation process. If an error occurs during installation, everything is rolled back. The uninstall is also clean, unless you change its behavior.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi
I want to stop (or abort) a thread, when the user does something (like log out), and then start it again (from the beguining) when he does something else (like log in).
But when I stop a thread, I cannot restar call thread.start on it. How can I do it?
thanks
|
|
|
|
|
If this is a non-user-specific thread (i.e., there's one thread that handles all logins and logoffs, not one per user), you could conceivably get by without killing the thread, but rather setting some flag that shows the thread contents are "invalid" (like using a SetData call, etc.), and then using either Thread.Suspend or Thread.Sleep(Timeout.Infinite) on it.
Of course, this depends entirely on the implementation...
Jeremy Kimball
I have traveled the gutters, lo these many days, with no signs of life. Well met.
-brianwelsch
|
|
|
|
|
To add to what Jeremy has posted... Threads cannot be restarted once they're stopped, or Aborted. There is no method of restarting an Aborted thread. You must destroy the Thread object and create a new one, if you .Abort a thread or the thread reaches its own termination point.
You can use the Suspend and Resume methods, but you better know exactly what your doing, why your doing it, and have exhausted every other method before attempting to use these methods. Using these methods without knowing the details of what happens and why WILL result in a Deadlock condition and a hung application.
The full docs on the Threading in managed code starts here[^] on MSDN.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
how can I destroy the Thread object?
|
|
|
|
|