从.Net访问SQL Server与从Qt

Difference Between SQL Server Access from .Net Versus Qt

本文关键字:与从 Qt Server SQL Net 访问      更新时间:2023-10-16

我有两个应用程序,它们都访问同一个数据库。一个是用C#编写的,并使用.NET服务连接到数据库;另一个是用C++编写的,并使用Qt进行连接。我不是幕后机制的专家,所以我在一个特定的问题上有点挣扎。我遇到的问题是.NET应用程序远程运行良好,但Qt应用程序则不然。

这个问题是由服务器端问题引起的,其中Windows身份验证有一些奇怪之处。.NET应用程序在不触发Windows身份验证的情况下进行连接,但Qt应用程序显然正在使用Windows身份验证,尽管我尽了一切努力来避免它。显然,如果服务器得到修复(希望会得到修复),问题就会消失,但我需要创建一个额外的应用程序,它需要为更多的用户提供访问权限,而我无法处理所有用户的Windows身份验证,所以我需要想办法完全避免Windows身份验证。

.NET应用程序使用带有连接字符串的SqlDataAdapter类,该连接字符串的格式为"数据源=xxx.xxx.xxx.xxx;初始目录=nnnn;持久安全信息=True;用户ID=uuuuuu;密码=ppppp"。

Qt应用程序使用QSqlDatabase类和格式为"DRIVER={SQL SERVER};SERVER=xxx.xxx.xxx.xxx;Database=nnnn;UserID=uuuuuu;Password=ppppp"的连接字符串。

我试过在Qt应用程序中使用"数据源"格式,但它不起作用。我已经尝试了其他帖子中建议的各种参数(Trusted_Connection和Integrated Security),无论我做什么,Qt应用程序总是使用Windows身份验证,或者完全失败。失败时,错误消息指示连接字符串中存在无法识别的参数。

我花了几个小时搜索和试验。对于我需要编写的即将到来的应用程序,使用C#和.NET是一种可行的方法,但我对Qt更熟悉,使用这种方法可以更快地编写应用程序。在我看来,我应该能够在不经过Windows身份验证的情况下连接到服务器,但我现在不知所措。欢迎提出任何建议。

关于这个主题的另一个问题报告说,当他在连接失败后打印用户名时,这是他的本地用户名,而不是他在QSqlDatabase::setUserName中指定的用户名。在他的例子中,他将用户名和密码添加到连接字符串中(就像我最初的例子中一样)以使其工作。他的例子也使用了"user_id",而我的例子使用了"UserID"。(我不知道这些东西中的空格和下划线是否可以互换,但我有这种印象。)

当我在连接失败后打印QSqlDatabase对象的用户名时,无论我在连接字符串中输入了什么,我的用户名都是空白的。我既没有得到连接字符串中指定的用户名,也没有得到本地登录名。

他不起作用的代码还分别调用了QSqlDatabase::setUserName和QSqlDatabase::setPassword,而不是连接字符串。虽然这对他不起作用,但我没有尝试过,所以我尝试了,而且效果很好。

因此,在他的情况下,将身份验证放在连接字符串中是有效的;在我的情况下,在QSqlDatabase对象上指定身份验证是有效的。

虽然我仍然不清楚为什么会发生这些事情,但我的问题已经解决了,我可以继续使用Qt编写我的新应用程序,这将比在所有.NET技术上更快地开发。