Search code examples
odbcnsis

nsis nsODBC plugin not accepting all parameters


I am using the NSIS nsODBC plugin to create an systemdsn entry.

When I call the command as shown below it works and creates my system dsn odbc.

nsODBC::AddSysDSN "ODBC Driver 11 for SQL Server" "DSN=test" "server=localhost" "DATABASE=test" "Trusted_Connection=Yes"
Pop $0

Pop $0 Returns "Successful" and in my ODBC Data Source Administrator I see my connection and it works.

But I need to create my system dsn with a username and password, on the forums and site I have seen they say it should look like the following:

nsODBC::AddSysDSN "ODBC Driver 11 for SQL Server" "DSN=test" "server=test" "DATABASE=test" "UID=test" "PWD=test"
Pop $0

When I run this command Pop $0 returns the text "error" and no system dsn is created.

I have checked the SQL server instance it has the test database, a login account called test which is a system admin account, it is in mixed mode authentication.

Any suggestions as to what I am doing wrong as to why it will not create a system dsn with a username and password?

Thanks in advance Andy


Solution

  • That plug-in is badly designed because it uses everything on the stack as its parameters. It is also a very thin wrapper around the database API so as long as your stack is empty before calling then the problem is most likely a missing/wrong parameter and not a bug in the plug-in.

    Calling the plugin with parameters like "foo=1" "bar=baz" is "translated" to foo=1\0bar=baz\0\0 which is what you see on MSDN and that is the C/C++ syntax for a double null terminated key-pair string.

    Why is Server set to test and not localhost?

    The code listed on the MSDN page for ConfigDSN says:

    For example, to configure a data source that requires a user ID, password, and database name, a setup application might pass the following keyword-value pairs:

    DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0

    Maybe the pair order matters, I don't know.