【问题标题】:Get the the db connection string from the Dynamics CRM SDK从 Dynamics CRM SDK 获取数据库连接字符串
【发布时间】:2011-06-10 21:50:26
【问题描述】:

以查找所有未接电话的客户为例。在 SQL 中,HAVING 子句可以帮助您完成大部分工作。在 CRM SDK 中,它会有点困难,我敢打赌,会通过网络发送更多数据,供 CRM 服务器处理。

所以我希望我的插件、应用程序、自定义工作流程通过过滤视图读取数据库,然后通过 Web 服务更改它需要的内容。

问题:如何从 SDK 中获取组织背后的数据库的数据库连接字符串?

当然,我现在知道它是什么,并且可以对其进行硬编码或配置。但我希望用户使用发现服务和应用程序找到他们的 CRM 实例来处理其余的事情。

快速测试,简单的 SQL

SELECT subject, phonenumber, createdon FROM FilteredPhoneCall WHERE activityid = @phoneCallID

比 SDK 的 Retrieve 方法快大约 4 倍。

【问题讨论】:

    标签: sql-server performance dynamics-crm dynamics-crm-4


    【解决方案1】:

    据我所知,没有办法从组织服务中获取数据库服务器名称。您可以使用部署服务检索它(请参阅http://worldofdynamics.blogspot.com/2011/12/dynamics-crm-2011-c-code-for-retrieving.html),但除非您是部署管理员,否则该服务是无用的——即使是检索也是如此。

    据我所知,查看数据库信息的唯一方法是将视图/高级查找导出到动态电子表格 - 连接信息嵌入在 Excel XML 中。

    我开发了一个静态方法,给定一个 Org Url,它将下载一个动态电子表格并解析出连接字符串。

        /// <summary>
        /// Given a Dynamics CRM Org URL, retrieve the Database Connection string
        /// </summary>
        /// <param name="crmOrgUrlBase"></param>
        /// <returns></returns>
        private static string GetCrmDatabaseConnectionString(string crmOrgUrlBase)
        {
            string cleanurl = crmOrgUrlBase.ToLowerInvariant().Trim().Replace("/xrmservices/2011/organization.svc", "");
            {
                int mainPos = cleanurl.IndexOf("/main.aspx");
                if (mainPos > 0)
                {
                    cleanurl = cleanurl.Substring(0, mainPos);
                }
            }
    
            string requestPayload = @"xdpi=96&exportType=list&useSqlQuery=1&fetchXml=%3Cfetch+distinct%3D%22false%22+no-lock%3D%22false%22+mapping%3D%22logical%22+page%3D%221%22+count%3D%2250%22+returntotalrecordcount%3D%22true%22%3E%3Centity+name%3D%22systemuser%22%3E%3Cattribute+name%3D%22systemuserid%22%2F%3E%3Cattribute+name%3D%22fullname%22%2F%3E%3Cattribute+name%3D%22fullname%22%2F%3E%3Corder+attribute%3D%22fullname%22+descending%3D%22false%22%2F%3E%3C%2Fentity%3E%3C%2Ffetch%3E%0D%0A&layoutXml=%3Cgrid+name%3D%22excelGrid%22+select%3D%220%22+icon%3D%220%22+preview%3D%220%22%3E%3Crow+name%3D%22result%22+id%3D%22systemuserid%22%3E%3Ccell+name%3D%22fullname%22+width%3D%22100%22%2F%3E%3C%2Frow%3E%3C%2Fgrid%3E%0D%0A";
            string url = cleanurl + "/_grid/print/export_live.aspx";
    
            string response = null;
    
    
            using (var wc = new System.Net.WebClient())
            {
                wc.UseDefaultCredentials = true;
                wc.Headers.Add("Accept-Encoding", "gzip, deflate");
                wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                wc.Headers.Add("DNT", "1");
                response = wc.UploadString(url, requestPayload);
            }
    
    
            var xe = System.Xml.Linq.XElement.Parse(response);
    
    
            System.Xml.Linq.XNamespace nn = "urn:schemas-microsoft-com:office:spreadsheet";
            System.Xml.Linq.XNamespace nn2 = "urn:schemas-microsoft-com:office:excel";
    
    
            var connectionEl = xe.Element(nn + "Worksheet").Element(nn2 + "QueryTable").Element(nn2 + "QuerySource").Element(nn2 + "Connection");
    
            string rawString = connectionEl.Value;
    
            Regex rex = new Regex("SERVER=([^;]+);DATABASE=([^;]+)", RegexOptions.Compiled);
    
            var m = rex.Match(rawString);
    
            string server = m.Groups[1].Value;
            string database = m.Groups[2].Value;
    
            return "DATA SOURCE=" + server +";INITIAL CATALOG=" + database + ";Integrated Security=SSPI";
        }
    

    它对用户使用一个简单的查询——查询并不重要,因为我们需要的只是数据库连接字符串。

    我的原始博文在这里: http://www.shulerent.com/2015/01/19/get-the-sql-server-and-database-name-from-dynamics-crm/

    【讨论】:

    • 感谢分享此代码 sn-p。它对我有用。最初我遇到了(401)未经授权的错误。然后我在 WebClient 上添加了凭据,它运行良好。再次感谢。
    【解决方案2】:

    我不知道有什么方法可以从 SDK/WebServices 访问该信息,我通常将连接字符串保存在配置文件或项目设置中。

    有很多因素可能会根据安装设置而改变:

    • 数据库服务器名称
    • 安装类型(本地、IFD 等)
    • DB 身份验证(集成、密码等)

    但是,如果您在内部部署中使用集成安全性,您可能无需即时创建连接字符串...

    string dbServerName = "SERVERNAME";
    string orgName = getOrgNameFromDiscoveryService();
    
    string connectionString = String.Format("Data Source={0};Initial Catalog={1}__MSCRM;Integrated Security=True", dbServerName, orgName);
    
    //create sql connection
    

    【讨论】:

    • 服务器名称是症结所在。我处理本地安装,并使用集成身份验证,所以这些都不重要(至少对我而言)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 2019-01-27
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多