How to fix .NET app using Microsoft.Jet.OLEDB.4.0 on Windows 7 64-bit

You are happy Windows 7 user and one day you install an application, which was just fine on Windows XP, Windows Vista, run it and get…

„Microsoft.Jet.OLEDB.4.0′ provider is not registered on the local machine”  (or „Dostawca ‚Microsoft.Jet.OLEDB.4.0′ nie jest zarejestrowany na lokalnym komputerze.” in Polish)

What’s wrong? Microsoft just „forgot” to implement Jet 4.0 in 64-bit mode.

How to fix it?

Run CorFlags.exe tool (available with Windows SDK package) to force app to be run in 32-bit mode (32-bit Jet 4.0 IS implemented)

CorFlags.exe <application exe file> /32BIT+

The side effect is that strong name signature is broken. If you have SNK key file with the private signing key you can re-sign the executable using SN.exe

SN.exe -R <application exe file> <snk file>

Reklamy

Communicating with Netduino via USB

On netduino forums you can find information, that SecretLabs team works on 2-way USB communication based on HID implementation, but the work is still in progress. In 4.1.1 beta firmware it basically works, but you need to use serial communication and do „some magic” with external power and USB connection.

Yesterday I found out that reading Debug.Print messages sent from .NET Microframework code running on Netduino is quite simple. It’s only one way (Netduino -> PC), but sometimes it is enough and the solution is very simple.

In your project add reference to MFDeployEngine.dll (usually in C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.1\Tools\ folder). You also need to reference Microsoft.Build.Utilities.v4.0.dll (from C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\) and target the code for .NET Framework 4 (not .NET 4 Client Profile).

Here is the code of Windows Form which displays all messages in the textbox:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.NetMicroFramework.Tools.MFDeployTool.Engine;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();

using (MFDeploy mfd = new MFDeploy()) {
IList<MFPortDefinition> portDefs = mfd.EnumPorts(TransportType.USB);
dev = mfd.Connect(portDefs[0]);
dev.OnDebugText += new EventHandler<DebugOutputEventArgs>(dev_OnDebugText);
}
}

MFDevice dev;


void dev_OnDebugText(object sender, DebugOutputEventArgs e) {
MethodInvoker action = delegate { textBox1.Text += e.Text; };
textBox1.BeginInvoke(action);
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
dev.Dispose();
}
}
}

Dziwny błąd podczas wysyłania maila: System.Net.Mail.SmtpException: „Syntactically invalid EHLO argument(s)”

Jeden z moich programów przestał wysyłać emaile po reinstalacji Windows. Występował wyjątek „System.Net.Mail.SmtpException: Błąd składni w parametrach lub argumentach. Odpowiedź serwera: Syntactically invalid EHLO argument(s)”.

Przyczyna była zaskakująca: znak podkreślenia w nazwie komputera (Windows).

wygooglowane rozwiązanie

Dodawanie ról w nowo utworzonej bazie danych MS SQL dla wbudowanej grupy (np. „Użytkownicy”)

W skrócie: jednym z elementów instalacji programu, który piszę jest wykonanie skryptu, który zakłada bazę, tworzy tabele i dodaje role db_datareader i db_datareader dla użytkowników lokalnych maszyny.

Pierwsza próba:

CREATE USER [BUILTIN\Użytkownicy] FOR LOGIN [BUILTIN\Użytkownicy]
EXEC sp_addrolemember N'db_datareader', N'BUILTIN\Użytkownicy'
EXEC sp_addrolemember N'db_datawriter', N'BUILTIN\Użytkownicy'

Działa, ale tylko w polskiej wersji Windows, bo w angielskiej wersji grupa nazywa się ‚BUILTIN\Users’!

Trzeba więc posłużyć się metodą SUSER_SNAME, która dla SID (Security Id) zwróci nazwę grupy w systemie (w odpowiednim języku).

Poprawiony skrypt wygląda teraz tak:

declare @user sysname
set @user = SUSER_SNAME(0x01020000000000052000000021020000)
exec sp_grantdbaccess @user, @user -- == CREATE USER @user FOR LOGIN @user
EXEC sp_addrolemember N'db_datawriter', @user
EXEC sp_addrolemember N'db_datareader', @user

SQLite, NHibernate i SchemaUpdate

Dowiedziałem się niedawno, że NHibernate ma w namespace NHibernate.Tool.hbm2ddl dwie przydatne klasy: SchemaExport i SchemaUpdate. Pierwsza z nich umożliwia utworzenie struktury bazy danych na podstawie plików mapujących, a druga pozwala uaktualnić strukturę po zmianach mapowania. Napisałem kawałek kodu (jako bazę używałem SQLite), wywołałem odpowiednie metody klasy SchemaExport i struktura się utworzyła. Ale już uaktualnienie nie działało. Procedura się wykonała, żadnych błędów nie było ale i żadna zmiana w bazie danych nie nastąpiła! WTF? Pogooglowałem i okazało się, że z SQLite uaktualnianie struktury po prostu nie działa.

Sprawdziłem ten sam kod z bazą MS SQL – i działa bez problemów.