Получить строку подключения к базе данных из SDK Dynamics CRM - PullRequest
1 голос
/ 11 июня 2011

Возьмите пример поиска всех клиентов с более чем одним открытым телефонным звонком.В SQL предложение HAVING поможет вам в этом.В CRM SDK будет немного сложнее, и я готов поспорить, что будет загружено больше данных, отправляемых по сети только для обработки сервером CRM.

Поэтому я хотел бы, чтобы мои плагины, приложения,настраиваемые рабочие процессы для чтения базы данных через отфильтрованные представления, а затем для изменения того, что нужно, через веб-сервис.

Вопрос: Как получить строку подключения к базе данных для базы данных, стоящей за организацией, из SDK?

Конечно, я знаю, что это сейчас, и могу труднозакодируйте его или настройте.Но я хочу, чтобы пользователь нашел свой экземпляр CRM, используя службу обнаружения, а приложение позаботится обо всем остальном.

Просто из быстрого теста простой SQL

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

примерно в 4 раза быстрее, чем метод Retrieve в SDK.

Ответы [ 2 ]

3 голосов
/ 20 января 2015

Насколько я могу судить, нет способа получить имя сервера базы данных из службы организации. Вы можете получить его, используя Службу развертывания (см. http://worldofdynamics.blogspot.com/2011/12/dynamics-crm-2011-c-code-for-retrieving.html),, но эта служба бесполезна, если вы не являетесь администратором развертывания - даже для получения.

Что мне известно, единственный способ просмотреть информацию базы данных - это когда вы экспортируете представление / расширенный поиск в динамическую электронную таблицу - информация о подключении встроена в Excel XML.

Я разработал статический метод, который с учетом URL-адреса Org загружает динамическую электронную таблицу и анализирует строку подключения.

    /// <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/

1 голос
/ 16 июня 2011

Я не знаю ни одного способа доступа к этой информации из SDK / WebServices, я обычно сохраняю строку подключения в файле конфигурации или в настройках проекта.

Существует множество факторов, которые могут измениться.в зависимости от настроек установки:

  • Имя сервера БД
  • Тип установки (в помещении, IFD и т. д.)
  • Аутентификация БД (встроенная, пароль и т. д.))

Однако, если бы вы использовали встроенную защиту для локального развертывания, вы, вероятно, могли бы избежать создания строки подключения на лету ...

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
...