31.10.2008, 00:25 | #1 |
Участник
|
Доступ к базе данных SQL из плагина
CRM 4.0
В плагине нужно получить данные, но не с помощью CrmService, а с помощью обращения к базе SQL. Для подключения к базе нужно как минимум знать ее имя. По началу сделал так: Код: ... string databaseName = сontext.OrganizationName + "_MSCRM"; string connectionString = "Data Source=localhost;Initial Catalog=" + databaseName + ";Integrated Security=SSPI"; ... Собственно вопрос: можно ли каким нибудь образом получить имя базы данных CRM? Будь вместо плагина обычная ASP.NET страничка, я бы не парился и вбил имя базы в web.config, а вот что делать с плагином - ума не приложу... |
|
31.10.2008, 06:30 | #2 |
Участник
|
При регистрации плагина можно использовать поля Unsecure / Secure Configuration, куда можно записывать настройки (можно в виде xml).
http://blogs.msdn.com/crm/archive/20...-plug-ins.aspx |
|
31.10.2008, 08:14 | #3 |
Moderator
|
А чем плох CrmService?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
31.10.2008, 10:37 | #4 |
Участник
|
ZooY
В плагине же можно писать любой код .NET Framework'a. Соотвественно можно погуглить код, где идет обращение к серверу и скачиание всех имен баз. Соотвестевенно потом разбираешь. Я делал еще проще (мож у тебя есть возможность сделать также). Сделал для плагина xml-ый конфиг и туда вписал имя базы. В коде считал его и вперед. Артем Enot Грунин Ну как минимум тем, что не умеет с датой и временем работать, есть ограничения на Order, да и вообще не всякий sql запрос опишешь в объектам CrmServic'a, а иногда и легче sql написать, нежели создавать тучу объектов... |
|
|
За это сообщение автора поблагодарили: ZooY (1). |
31.10.2008, 11:14 | #5 |
Moderator
|
Что там что там с датой и временем? Какие ограничения на Order?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
31.10.2008, 11:48 | #6 |
Участник
|
У меня SQL-запрос, который ищет максимальное значение номера, с учетом того, что номер содержит префикс и некоторое количество нулей перед самим числом. Не думаю что такой запрос можно сделать для CrmService (только если выбрать все записи, а потом перебирать их по одной ища нужное, но это не вариант).
С XMLным конфигом идея хорошая, в крайнем случае придется пользовать ее. Но появилась мысля о реестре, там нет имени базы? И вообще на сколько это правильно использовать реестр для получения например имени сервера CRM и других данных? |
|
31.10.2008, 14:18 | #7 |
Участник
|
Артем Enot Грунин с датой, на сколько мне известно, при работе с CrmService нельзя проделывать всякие арифметичемкие операции с конкретными частями времени из даты, делить дату на части (DatePart и т.д.), а используя Order нельзя упорядочить данные по значениям связанной записи.
ZooY Хм.. Имхо в реестре такие вещи не храняться, а если и да, то как-то это неочень и будет как-то неординарно . Но может была такая практика... |
|
31.10.2008, 14:36 | #8 |
Moderator
|
А не проще хранить значения счетчиков в отдельной сущности? Не вижу принципиальной разницы в переборе всей базы и переборе всей базы с последующим поиском максимального. Если этот вариант не нравится сделайте запрос на выборку нужного атрибута с сортировкой от максимального к минимальному и укажите, что нужно вернуть только 1 запись.
Читайте SDK и откроете для себя много нового. Рекомендую изучить цепочку RetrieveMultiple, QueryExpression, PageInfo.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
31.10.2008, 15:23 | #9 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Если этот вариант не нравится сделайте запрос на выборку нужного атрибута с сортировкой от максимального к минимальному и укажите, что нужно вернуть только 1 запись.
Читайте SDK и откроете для себя много нового. Рекомендую изучить цепочку RetrieveMultiple, QueryExpression, PageInfo. FE-1 FE-3 FE-10 Полагаю, что результатом будет: FE-3 FE-1 FE-10 как и положено при сравнее строк. И результат очевидно бует неправильным. Но собственно мы отклонились от темы. Вопрос не в том, как лучше организовать нумерацию, а в том как узнать имя базы данных CRM. |
|
01.11.2008, 09:29 | #10 |
Moderator
|
Эти настройки хранятся в базе MSCRM_CONFIG. Таблица Organization. Если есть необходимость сделать универсально, можно читать отсюда.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
03.11.2008, 13:50 | #11 |
Участник
|
Да, таблицу Organization я нашел. Возникает только вопрос - от чьего имени выполняется плагин. Попробовал обратиться к базе MSCRM_CONFIG из простого ASP.NET-расширения - не все пользователи могут читать эту базу. Попробовал создать плагин. Вроде бы при инициализации плагина простым пользователем доступ к базе есть, но хотелось бы все таки уточнить...
|
|
04.11.2008, 10:01 | #12 |
Чайный пьяница
|
Цитата:
Сообщение от ZooY
CRM 4.0
В плагине нужно получить данные, но не с помощью CrmService, а с помощью обращения к базе SQL. Для подключения к базе нужно как минимум знать ее имя. По началу сделал так: Код: ... string databaseName = сontext.OrganizationName + "_MSCRM"; string connectionString = "Data Source=localhost;Initial Catalog=" + databaseName + ";Integrated Security=SSPI"; ... Собственно вопрос: можно ли каким нибудь образом получить имя базы данных CRM? Будь вместо плагина обычная ASP.NET страничка, я бы не парился и вбил имя базы в web.config, а вот что делать с плагином - ума не приложу... Код: RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM"); //Retreive MSCRM DataBase connection string string configDBConnectionString = key.GetValue("configdb").ToString(); //next part - i connect to config db and retreive data to config connection to client db DataSet clientDBConnectionData = new DataSet(); using(SqlConnection connection = new SqlConnection(configDBConnectionString)) { connection.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = connection; cmd.CommandType = CommandType.Text; cmd.CommandText = string.Format("Select SqlServerName, DatabaseName From Organization Where UniqueName = '{0}'", crmOrganizationName); using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) adapter.Fill(clientDBConnectionData); } connection.Close(); } if (clientDBConnectionData.Tables.Count == 0 || clientDBConnectionData.Tables[0].Rows.Count == 0) throw new Exception("Check your config parameters!"); string connectionString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=SSPI", new object[] { (string)clientDBConnectionData.Tables[0].Rows[0]["SqlServerName"], (string)clientDBConnectionData.Tables[0].Rows[0]["DatabaseName"]}); PS харкодинг localhost-a - не хороший стиль, потому что Application Server и DB Server - могут быть разнесены. Последний раз редактировалось a33ik; 04.11.2008 в 10:10. |
|
|
|