|
|
#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, а вот что делать с плагином - ума не приложу... |
|
|
|
|
#2 |
|
Участник
|
При регистрации плагина можно использовать поля Unsecure / Secure Configuration, куда можно записывать настройки (можно в виде xml).
http://blogs.msdn.com/crm/archive/20...-plug-ins.aspx |
|
|
|
|
#3 |
|
Moderator
|
А чем плох CrmService?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#4 |
|
Участник
|
ZooY
В плагине же можно писать любой код .NET Framework'a. Соотвественно можно погуглить код, где идет обращение к серверу и скачиание всех имен баз. Соотвестевенно потом разбираешь. Я делал еще проще (мож у тебя есть возможность сделать также). Сделал для плагина xml-ый конфиг и туда вписал имя базы. В коде считал его и вперед. ![]() Артем Enot Грунин Ну как минимум тем, что не умеет с датой и временем работать, есть ограничения на Order, да и вообще не всякий sql запрос опишешь в объектам CrmServic'a, а иногда и легче sql написать, нежели создавать тучу объектов... |
|
|
|
| За это сообщение автора поблагодарили: ZooY (1). | |
|
|
#5 |
|
Moderator
|
Что там что там с датой и временем? Какие ограничения на Order?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#6 |
|
Участник
|
У меня SQL-запрос, который ищет максимальное значение номера, с учетом того, что номер содержит префикс и некоторое количество нулей перед самим числом. Не думаю что такой запрос можно сделать для CrmService (только если выбрать все записи, а потом перебирать их по одной ища нужное, но это не вариант).
С XMLным конфигом идея хорошая, в крайнем случае придется пользовать ее. Но появилась мысля о реестре, там нет имени базы? И вообще на сколько это правильно использовать реестр для получения например имени сервера CRM и других данных? |
|
|
|
|
#7 |
|
Участник
|
Артем Enot Грунин с датой, на сколько мне известно, при работе с CrmService нельзя проделывать всякие арифметичемкие операции с конкретными частями времени из даты, делить дату на части (DatePart и т.д.), а используя Order нельзя упорядочить данные по значениям связанной записи.
ZooY Хм.. Имхо в реестре такие вещи не храняться, а если и да, то как-то это неочень и будет как-то неординарно . Но может была такая практика...
|
|
|
|
|
#8 |
|
Moderator
|
А не проще хранить значения счетчиков в отдельной сущности? Не вижу принципиальной разницы в переборе всей базы и переборе всей базы с последующим поиском максимального. Если этот вариант не нравится сделайте запрос на выборку нужного атрибута с сортировкой от максимального к минимальному и укажите, что нужно вернуть только 1 запись.
Читайте SDK и откроете для себя много нового. Рекомендую изучить цепочку RetrieveMultiple, QueryExpression, PageInfo.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#9 |
|
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Если этот вариант не нравится сделайте запрос на выборку нужного атрибута с сортировкой от максимального к минимальному и укажите, что нужно вернуть только 1 запись.
Читайте SDK и откроете для себя много нового. Рекомендую изучить цепочку RetrieveMultiple, QueryExpression, PageInfo. FE-1 FE-3 FE-10 Полагаю, что результатом будет: FE-3 FE-1 FE-10 как и положено при сравнее строк. И результат очевидно бует неправильным. Но собственно мы отклонились от темы. Вопрос не в том, как лучше организовать нумерацию, а в том как узнать имя базы данных CRM. |
|
|
|
|
#10 |
|
Moderator
|
Эти настройки хранятся в базе MSCRM_CONFIG. Таблица Organization. Если есть необходимость сделать универсально, можно читать отсюда.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. ![]() MS Certified Dirty Magic Professional
|
|
|
|
|
#11 |
|
Участник
|
Да, таблицу Organization я нашел. Возникает только вопрос - от чьего имени выполняется плагин. Попробовал обратиться к базе MSCRM_CONFIG из простого ASP.NET-расширения - не все пользователи могут читать эту базу. Попробовал создать плагин. Вроде бы при инициализации плагина простым пользователем доступ к базе есть, но хотелось бы все таки уточнить...
|
|
|
|
|
#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. |
|
|
|
|
|