Few days ago I got an exception while enumerating a Dictionary<>. It was a null pointer exception for a key object. Since the keys in a dictionary may not be null I've started to dig and found the reason - multi threading writers to a dictionary without locks can cause null key (even if the writing was before the enumeration).
Solution: locks.
Wednesday, September 26, 2007
Friday, September 21, 2007
Access MDB on windows 64 bit using C#
Few days ago I had to install software I wrote in C# which uses Access MDB files on a Windows 2003 x64. After installing the software (compiled for 32bit) I got an error saying the Microsoft.Jet.OLEDB.4.0 provider is not installed.
After a short search I found out there isn't JET provider for x64 systems, however, Windows 2003 comes with 2 sets of ODBC providers: 64bit and 32bit, which can be accessed with 2 separate programs:
c:\windows\SysWOW64\odbcad.exe - 32bit providers
c:\windows\system\odbcad.exe - 64bit providers
When checking the list of x32 providers I found Access MDB provider! So at this point I started to check how to force .NET applications to run in x32 mode. 5 minutes later I had the solution - the .NET SDK utility CorFlags.exe:
CorFlags /32bit+ MyProgram.exe
Works like a charm. Now my program runs as before with Access MDB on Windows 2003 x64.
UPDATE: Better solution with the same results -
Project -> Properties -> Build
Set "Platform Target" to x86
After a short search I found out there isn't JET provider for x64 systems, however, Windows 2003 comes with 2 sets of ODBC providers: 64bit and 32bit, which can be accessed with 2 separate programs:
c:\windows\SysWOW64\odbcad.exe - 32bit providers
c:\windows\system\odbcad.exe - 64bit providers
When checking the list of x32 providers I found Access MDB provider! So at this point I started to check how to force .NET applications to run in x32 mode. 5 minutes later I had the solution - the .NET SDK utility CorFlags.exe:
CorFlags /32bit+ MyProgram.exe
Works like a charm. Now my program runs as before with Access MDB on Windows 2003 x64.
UPDATE: Better solution with the same results -
Project -> Properties -> Build
Set "Platform Target" to x86
Monday, September 3, 2007
SQLServer database grows big
I was looking around for a tool that will tell me how much space each table in my SQLServer database. After little search I found this sql script, which really helped me finding which table eat away all the space in the database.
btw - sometimes people forget that if you don't define your backup mode to "Simple" the transaction log will grow unless you backup the database.
btw - sometimes people forget that if you don't define your backup mode to "Simple" the transaction log will grow unless you backup the database.
Labels:
SQL Server
Saturday, August 25, 2007
IE opens KMZ as ZIP
Yesterday I've decided to play around with Google Earth so I wrote a small KMZ file, which I've uploaded to my site. However when I've tried to download the KMZ, IE opened the file as ZIP.
After a short search I found out the reason: my hosting site didn't add the Google Earth MIME extension (see the bottom of that page) to the Apache server. Since I don't have the privileges to add the extensions I was looking for a work around. One way I found was to put my KMZ in Google Pages. Ugly and probably not allowed with Google Pages license - putting a file in Google Page as storage only.
After some more digging I found the following solution - create a script that add the correct MIME header (I used PHP but I guess you can do it in ASP very easily):
<?php
header('Content-type: application/vnd.google-earth.kmz');
header('Content-Disposition: attachment; filename="myfile.kmz"');
readfile('myfile.kmz');
?>
After a short search I found out the reason: my hosting site didn't add the Google Earth MIME extension (see the bottom of that page) to the Apache server. Since I don't have the privileges to add the extensions I was looking for a work around. One way I found was to put my KMZ in Google Pages. Ugly and probably not allowed with Google Pages license - putting a file in Google Page as storage only.
After some more digging I found the following solution - create a script that add the correct MIME header (I used PHP but I guess you can do it in ASP very easily):
<?php
header('Content-type: application/vnd.google-earth.kmz');
header('Content-Disposition: attachment; filename="myfile.kmz"');
readfile('myfile.kmz');
?>
Labels:
Google Earth,
KMZ,
PHP
Wednesday, August 15, 2007
Microsoft CRM - Outlook client doesn't load...
I've just finished fighting with MS-CRM Outlook add-in. It was really time consuming for no good reason.
The battle story:
The MS-CRM was working just fine from the IE interface but I wanted the Outlook interface. After installing the Outlook add-in I got the following message when I started Outlook:
"There is a problem communicating with the Microsoft CRM Server. The server might be unavailable. Try again later. If the problem persists, contact your system administrator."
I found two posts in the MS-Knowledge Base which didn't helped at all:
http://support.microsoft.com/kb/910090
http://support.microsoft.com/kb/913509/
After digging some more in the MS news groups I found the solution (for me, and I guess for most poeple with CRM out-of-the-box). You can skip to step 3 in order to verify this is your problem with the CRM.
1. Add the CRM site to the trusted sites list in IE (Tools->Internet Options->Security, click on "Trusted Sites" then "Sites" and add the site URL).
2. Verify that the trusted sites passwords are stored in IE (Tools->Internet Options->Security, click on "Trusted Sites" then "Custom Level", go all the way down to "User Authentication" -> "Logon", and choose "Automatic logon with username and password")
3. Open MS-CRM in Internet explorer and insert the password. Close IE. Open again and verify you don't have to enter the password again. If you do, you did something wrong in steps 1 or 2.
4. Open Outlook.
The battle story:
The MS-CRM was working just fine from the IE interface but I wanted the Outlook interface. After installing the Outlook add-in I got the following message when I started Outlook:
"There is a problem communicating with the Microsoft CRM Server. The server might be unavailable. Try again later. If the problem persists, contact your system administrator."
I found two posts in the MS-Knowledge Base which didn't helped at all:
http://support.microsoft.com/kb/910090
http://support.microsoft.com/kb/913509/
After digging some more in the MS news groups I found the solution (for me, and I guess for most poeple with CRM out-of-the-box). You can skip to step 3 in order to verify this is your problem with the CRM.
1. Add the CRM site to the trusted sites list in IE (Tools->Internet Options->Security, click on "Trusted Sites" then "Sites" and add the site URL).
2. Verify that the trusted sites passwords are stored in IE (Tools->Internet Options->Security, click on "Trusted Sites" then "Custom Level", go all the way down to "User Authentication" -> "Logon", and choose "Automatic logon with username and password")
3. Open MS-CRM in Internet explorer and insert the password. Close IE. Open again and verify you don't have to enter the password again. If you do, you did something wrong in steps 1 or 2.
4. Open Outlook.
Labels:
Microsoft CRM,
Outlook
Sunday, July 1, 2007
Leaking Form.ShowDialog
In the last few weeks I was debugging an application to find leaking memory. I found lots of tips in this MSDN article. Something I found few times is that people are not aware that you MUST call Dispose() after you call ShowDialog (see Microsoft docs).
The simplest way to create a memory leak with a form:
{
Form form = new FooForm();
form.Owner = this
form.ShowDialog();
}
After this code block will finish the form "form" will stay in the memory because the owner form holds a refrence to the form in OwnedForms. To free the memory you must call form.Dispose();
The simplest way to create a memory leak with a form:
{
Form form = new FooForm();
form.Owner = this
form.ShowDialog();
}
After this code block will finish the form "form" will stay in the memory because the owner form holds a refrence to the form in OwnedForms. To free the memory you must call form.Dispose();
Labels:
.NET Debugging,
C#,
Memory Leak
Monday, May 28, 2007
Fast DataTable loading from IDataReader
I was using the Load method of DataTable to load data from IDataReader the other day, and while profiling the application I found out that this is my program bottleneck.
I've just wrote a quick & dirty function which does the same task much faster:
I've just wrote a quick & dirty function which does the same task much faster:
private static DataTable ReaderToDataTable(IDataReader reader)
{
int fieldCount = reader.FieldCount;
DataTable result = new DataTable("Query Result");
for (int i = 0; i < reader.FieldCount; i++)
{
DataColumn column = result.Columns.Add(reader.GetName(i));
column.DataType = reader.GetFieldType(i);
}
object[] row = new object[fieldCount];
while (reader.Read())
{
reader.GetValues(row);
result.Rows.Add(row);
}
return result;
}
Labels:
C#,
Performance
Subscribe to:
Posts (Atom)