【问题标题】:PromptDataSource and password提示数据源和密码
【发布时间】:2013-06-09 22:24:15
【问题描述】:

我使用PromptDataSource 允许用户设置数据库连接。

connectionString := ADOdb.PromptDataSource(0, '');

但是,当使用 SQL Server Native Client 10.0 提供程序时,我无法使用 “允许保存密码”:

PromptDataSource 返回一个带有Persist Security Info=False 的字符串,并且在使用该提供程序时省略密码:

Provider=SQNCLI10.1;Integrated Security="";Persist Security Info=False;User ID=MGH;Initial Catalog="";Data Source=stackoverflow.com;Initial File Name= "";服务器 SPN=""

我尝试过的其他提供程序也有效,我能做些什么来解决这个问题?

注意:我相信提供程序是随 MS SQL Server 2008 R2 一起安装的。

【问题讨论】:

    标签: sql-server-2008 delphi delphi-2010 adodb sql-server-native-client


    【解决方案1】:

    编辑:我忘了包括我的答案:无法完成。

    不是你想听到的答案,但我猜这是一个故意的错误 - 你不会说服微软修复它。


    我可以确认用户提供的密码工作:

    • Microsoft.Jet.OLEDB.4.0:Microsoft Jet 4.0 OLE DB 提供程序(有效)
    • MSOLAP:Microsoft OLE DB Provider for Analysis Services 10.0(工作)
    • MSDASQL:用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序(有效)
    • MSDAORA:Microsoft OLE DB Provider for Oracle(工作)
    • SQLOLEDB:用于 SQL Server 的 Microsoft OLE DB 提供程序(有效)
    • MSDataShape:MSDataShape (有效)
    • SQLNCLI:SQL Server Native Client(工作)(2005 年发布)

    失败

    • SQLNCLI10:SQL Server Native Client 10.0 (失败)(2008 年发布)
    • SQLNCLI11:SQL Server Native Client 11.0 (失败)(2012 年发布)

    看起来微软的默认策略又被打破了。

    阅读奖励

    更多微软默认损坏的东西:

    【讨论】:

    • 我仍然希望通过 API 调用该对话框来解决它。
    • 天啊,我还以为是一个直接的API。现在看IBPromptInitialize interface;强制用户only 被允许选择SQLOLEDB 是一种可接受的解决方法吗?因为您可以将用户的选择限制为指定的 ProgID(例如,仅 SQLOLEDB)。
    • 我想允许使用提供程序,所以我将提供另一个选项来提供密码并修补 ConnectionString。
    【解决方案2】:

    像往常一样填写Dataling对话框后,转到Dataling Properties最后一个选项卡“All”并将“Extended properties”填写为

    Trusted_Connection=no;Server=..........;Database=.....

    并且“持久安全信息”也设置为“真”,如果默认情况下未填充为真(本机客户端 10 和 11 在每次更改密码后自行将其填充为假)。在使用此代码(或其他等效语言)之后,因为具有空字符串值的“集成安全性”对于本机客户端提供程序来说是错误的属性:

    ConnectionString := PromptDataSource(Application.Handle, ConnectionString);
    if ContainsText(ConnectionString, 'SQLNCLI10') or ContainsText(ConnectionString, 'SQLNCLI11') then
    begin
     ConnectionString := StringReplace(ConnectionString, 'Integrated Security="";', '', [rfReplaceAll, rfIgnoreCase]);
    end;
    

    【讨论】:

      【解决方案3】:

      我将“全部”选项卡中的“持久安全信息”更改为 True 并且 在那里设置密码。之后我保存了密码

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多