|
|
Don't ya hate it when that happens.
Regardz
Colin J Davies
Sonork ID 100.9197:Colin
I am sick of fighting with Martin, I think I will ignore his posts from here on in, and spend the time working on articles instead.
Christian Graus
|
|
|
|
|
Let's say we have a class A that wraps a DB table. Now suppose this has an Add method, should we use a OleDbConnection local to that function to do the insert? Or should we have a OleDbConnection member for the class A and open it in the constructor and kill it in the destructor. The Add function is an infrequently used function. A is a remotable object and my worry is that it might be kept alive too long and in such cases if there is a network outage or something, I am scared that the class will be destroyed out of the blue and the DB might not be closed properly.
Any suggestions are welcome
Nish
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
You may be better off using a DataSet. It caches data from the server and you can store it on the client (Assume you connect to a data source and display everything in a data grid for example)
Then you will perform any operations on the client and update everything in the end. Thus, you do not have to worry about the connection being help up.
For additional info on datasets check my article here.
I hope that helps.
Best regards,
Alexandru Savescu
|
|
|
|
|
Problem is that the DB connection is on the remoting server and it's the client that invokes calls remotely. The kind of app I have in mind had an issue that a client might connect and then disconnect only after 6 hours or even a full day. I am worried about a connection being alive for that long and timing out in between. Datasets also don't seem same for this. If a network failure occurs, then I won't be able to flush the data in time.
Nish
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
Well, having a connection open for 6 hours non-stop is bad in every sense you want: bad design, bad implementation etc. The Internet itself was not designed to keep connections alive (see the IP protocol). You have every reason for connections alive that long. You don't speak on a phone that much (and a phone keeps a connection open)
Anyway, datasets may be a better option. You may from time to time flush data in backgound (say every 30 minutes). Also, if data is not flushed on time (or timeout occurs when updating) then you can catch an exception and always retry.
Best regards,
Alexandru Savescu
|
|
|
|
|
It's not about bad design here Alex. I don't have a choice here. A remote client may do what it wants to. We cannot dictate to it to close after a minimum while
I like your periodic flush idea. I'll do that.
And yeah, I'll take a look at your Dataset article too
Thanks
Nish
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
If I need to remote 3-4 objects, should I start as many TcpChannels as there are objects and listen on them, meaning I have 4 ports open; or is it better design to have one master object which is remoted and which has methods to return each of the n number of objects?
Regards
Nish
p.s. The context is .NET remoting using MC++ and the BCL
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
I've got some problem trying to marshal an interface between threads in a process.
In Win32 app I can call CoMarshalInterThreadInterfaceInStream to marshal and
CoGetInterfaceAndReleaseStream to unmarshal or use Global Interface Table
but I don't know how to declare this functions/Com class in the
.NET. Or mayby there is another solution build-in the framework.
Can you guys write some example how to use this functions/COM class
I'll appreciate it.
Thanks in advance
43 68 65 65 72 73 2c
4d 69 63 68 61 65 6c
|
|
|
|
|
In my opionion the framework takes care of that for you.
Step back, rub your eyes, take a deep breath, stretch a bit, and reflect on the relative importance of CP, CG, the age / travel time sustained by supposedly 'fresh' cheese curds, and Life in General. - Shog9
|
|
|
|
|
That's right.
I found the answer in the .Net SDK.
But there is one requirement - both threads must be in the STA apartment, otherwise the function call on the interface will fail.
43 68 65 65 72 73 2c
4d 69 63 68 61 65 6c
|
|
|
|
|
i need to take data from an existing excel document use it to match something then place the output in a new column in the original excel document. is this possible? i program in c++ using the g++ complier in a unix environment...
|
|
|
|
|
It's very hard, to say, but try here
Regards
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
Hi! I am using an application that is using both managed to unmanaged code.
I want to copy data from a CString to a Stream* (it may be MemoryStream or BufferedStream - whichever is faster).
Can anyone help? Thanks
Best regards,
Alexandru Savescu
|
|
|
|
|
|
Sorry Nish, it does not work. Here is what I did:
CString str = "aaaa":
String* str1 = new String (str);
MemoryStream* mem1 = new MemoryStream (str1, false);
and the result is:
c:\Work\Test.cpp(332): error C2664: 'System::IO::MemoryStream::MemoryStream(unsigned char __gc[],bool)' : cannot convert parameter 1 from 'System::String __gc *' to 'unsigned char __gc[]'
I found an work arround that compiles and works but I hate it:
MemoryStream* mem = new MemoryStream (n) ;
for (int i = 0; i < n; i++)
mem->WriteByte (str[i]);
Do you have another solution?
Thanks!
Best regards,
Alexandru Savescu
|
|
|
|
|
Try this:
CString str = "aaaa";
String* strText = new String (str);
Byte message[] = System::Text::Encoding::ASCII->GetBytes( strText );
MemoryStream* sStream = new MemoryStream( message );
If you want to use diffrent encoding replace the bold text with the appropriate encoding like: Unicode, UTF7 or UTF8.
I should work
43 68 65 65 72 73 2c
4d 69 63 68 61 65 6c
|
|
|
|
|
Thanks. This really looks like a solution.
Best regards,
Alexandru Savescu
|
|
|
|
|
Hm... when you make a program you #using mscorlib.dll everytime and sometimes other files.. do my users of my app only need this file(s) or do they need the whole Runtime pack.. that big file you know... 20Mb or something..
Hope ya understand me!;)
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C# and C++!
|
|
|
|
|
Rickard Andersson wrote:
do they need the whole Runtime pack
Short answer, They need the whole runtime.
|
|
|
|
|
Rama Krishna wrote:
They need the whole runtime.
Argh, damn Microsoft...
Why this stupid thing? Why!?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C# and C++!
|
|
|
|
|
|
I was trying to be extra smart by implamenting typesafe collections in Managed C++. But, MC++ doesnot support covariant types.
You can't have
__property MyItem* get_Item(int index)
{
}
Because IList already has such a property.
I checked Nish's article he got away because he just implemented ICollextion and not IList.
|
|
|
|
|
TcpListener.AcceptTcpClient is a blocking call. How do I elegantly stop the call? From another thread say I want to stop listening. If I call TcpListener.Stop on the TcpListener object I get an exception. Some funny exception about how I halted a blocking operation. Right now I am putting an empty try{}...catch{} block and evading this exception. But there must be a more elegant solution! Any help is hugely appreciated!
Warm regards
Nish
Author of the romantic comedy
Summer Love and Some more Cricket [New Win]
Review by Shog9
Click here for review[NW]
|
|
|
|
|
Untested; but give this a shot. Instead of calling AcceptTcpClient() from the start; make calls to Pending() instead, and when it returns true THEN make the call to AcceptTcpClient .
Since that probably sounds convoluted, here's some code to illustrate it
TcpListener tcpL = ....;
tcpL.Start();
while(bShouldAcceptConnections)
{
if( tcpL.Pending() )
{
TcpClient tcpC = tcpL.AcceptTcpClient();
}
}
tcpL.Stop(); HTH,
James
"Java is free - and worth every penny." - Christian Graus
|
|
|
|