3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
1

Процедура на C# читающая XML поле таблицы

28.01.2016, 08:25. Показов 1267. Ответов 22
Метки нет (Все метки)

Доброго времени суток! Подскажите пожалуйста, не судите строго я новичок))

процедура делает следующее:
-Подключиться к бд (сделано)
-Читать XML поле ContextInfo таблицы [dbo].[okstat_CallChain] (сделано частично)
-Найти значение аттрибута Key=timestop (это дата) (сделано)
-Записать эту дату (сначала проверить !=NULL) в соответствующие строки по ключевому полю ChainId в эту же таблицу (okstat_CallChain) уже в столбец CallTimeEnd (сделано частично)


фотка таблицы
Процедура на C# читающая XML поле таблицы


Добавлено через 11 минут


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Program
{
static void Main(string[] args)
{
Guid ChainId=Guid.NewGuid(); /// Входной аргумент
 
using (SqlConnection cnn = new SqlConnection(@"Data Source = ZAPAD_SQL/DEV;Initial Catalog = oktell_manage; Integrated Security = True; Connect Timeout = 15;
Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"))
{
cnn.Open();
using (SqlTransaction trans = cnn.BeginTransaction(IsolationLevel.ReadUncommitted))
{
SqlCommand cmd = new SqlCommand("SELECT ContextInfo FROM ... WHERE ChainId=@ChainId", trans.Connection, trans);
cmd.Parameters.Add("@ChainId", SqlDbType.UniqueIdentifier).Value = ChainId;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read() == true)
{
XElement xd = XElement.Parse(reader[0].ToString());
var dates = from prop in xd.Descendants("property_simple")
where (string)prop.Attribute("key") == "timestop"
select DateTime.Parse((string)prop.Attribute("value"));
 
foreach (var date in dates)
//Console.WriteLine(date);   //Здесь нужно записать date в столбец CallTimeEnd этой же таблицы okstat_CallChain
//Console.ReadKey();
}
reader.Close();
}
 
... 
cmd.CommandText = "UPDATE .... WHERE ChainId=@ChainId";
.....
 
cmd.ExecuteNonQuery();
trans.Commit();
}
}
фотка таблицы
Нажмите на изображение для увеличения
Название: 2016-01-27.png
Просмотров: 5
Размер:	134.7 Кб
ID:	640646


пример XML первой строки
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<content Version="80903">
  <call commcount="3" taskcount="0">
    <property_simple key="datetimeformat" value="dd.MM.yyyy HH:mm:ss.fff" />
    <property_simple key="direction" value="1" name="cdIncoming" />
    <property_simple key="lineid" value="b1dc7ce0-6d27-48e1-b4dd-73901822e83f" />
    <property_simple key="linenumber" value="13013" />
    <property_simple key="callerid" value="8422274437" />
    <property_simple key="calledid" value="249265" />
    <property_simple key="idchain" value="82d548fe-00a7-4508-a2fb-001d16790349" />
    <property_cdata key="custominfo" />
    <property_simple key="timestart" value="20.01.2016 11:42:29.244" />
    <property_simple key="timeconnected" value="20.01.2016 11:42:29.291" />
    <property_simple key="timedisconnected" value="20.01.2016 11:43:01.559" />
    <property_simple key="timestop" value="20.01.2016 11:43:02.559" />
    <property_simple key="totalsec" value="33" />
    <property_simple key="emergency" value="0" />
    <property_simple key="callresult" value="busy" />
    <activity>
      <commutation index="0">
        <property_simple key="idconnection" value="cb81044c-001c-4226-84cd-b3125c2a71e4" />
        <property_simple key="type" value="2" name="IVR" />
        <property_simple key="custominfo" value="" />
        <property_simple key="timestart" value="20.01.2016 11:42:29.260" />
        <property_simple key="timestop" value="20.01.2016 11:42:43.817" />
        <property_simple key="totalsec" value="14" />
        <property_simple key="ivrscriptname" value="Главный" />
      </commutation>
      <commutation index="1">
        <property_simple key="idconnection" value="4d5d26b8-5ec4-45c5-bab0-3a82ed9caa93" />
        <property_simple key="type" value="1" name="Abonent" />
        <property_simple key="custominfo" value="" />
        <property_simple key="timestart" value="20.01.2016 11:42:44.021" />
        <property_simple key="timestop" value="20.01.2016 11:43:01.387" />
        <property_simple key="totalsec" value="17" />
        <abonents count="1">
          <abonent index="1">
            <property_simple key="lineid" value="14da513f-581a-462b-9a2b-9052cedeab9d" />
            <property_simple key="linenumber" value="17032" />
            <property_simple key="callerid" value="" />
            <property_simple key="userid" value="209214dc-251b-41b0-859e-e642155c9092" />
            <property_simple key="username" value="Дьячков Д.В. / Лемесев А.С." />
          </abonent>
        </abonents>
      </commutation>
      <commutation index="2">
        <property_simple key="idconnection" value="63d3595a-6454-4ade-8664-2c848829c83f" />
        <property_simple key="type" value="2" name="IVR" />
        <property_simple key="custominfo" value="" />
        <property_simple key="timestart" value="20.01.2016 11:43:01.528" />
        <property_simple key="timestop" value="20.01.2016 11:43:01.528" />
        <property_simple key="totalsec" value="0" />
        <property_simple key="ivrscriptname" value="_Сценарий возврата" />
      </commutation>
    </activity>
  </call>
</content>
Добавлено через 10 часов 19 минут
Видимо не для меня одного эта задачка очень сложна...(((
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2016, 08:25
Ответы с готовыми решениями:

Процедура, принимает строку (path) к файлу xml. Считываем его и возвращает xml
Добрый день. Помогите написать процедуру которая принимает строку в которой храниться путь к...

Увеличивает значение в поле Оклад таблицы КОПИЯ_ ШТАТНЫЕ_ЕДИНИЦЫ на 20% для строк со значением «бухгалтер» в поле На
Увеличивает значение в поле Оклад таблицы КОПИЯ_ ШТАТНЫЕ_ЕДИНИЦЫ на 20% для строк со значением...

Подставить значение в поле таблицы поле запроса
Здравствуйте, есть ли какая-то возможность подставить вместо поля в таблице поле с запроса? ...

Процедура выгрузки 1с в XML
Я создал справочник с 3 различными реквизитами в 1С:Підприємство 8.2 (8.2.16.368) Возможно как-то...

22
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 08:44 2
сериализация/десериализация спасет отца русской демократии
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 09:18  [ТС] 3
Цитата Сообщение от pincet Посмотреть сообщение
сериализация/десериализация спасет отца русской демократии
Извините видимо я не понимаю о чём Вы, о уровне изоляции транзакции или Вы что то конкретное имеете ввиду?
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 09:30 4
сериализация XML
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 09:41  [ТС] 5
Цитата Сообщение от pincet Посмотреть сообщение
сериализация XML
Нельзя ли поконкретнее с примером, в данный момент хотелось бы организовать запись в бд извлечённых значений из XML поля

Добавлено через 7 минут
Я так понимаю, что сериализация XML используется для чтения/записи XML документа, но в данной программе уже организована выборка данных XML документа, нужно их записать в БД
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 09:52 6
OMG,
тебе шашечки или ехать? Про Update что нибудь слыхал?
T-SQL
1
update okstat_CallChain set CallTimeEnd=@MyDearDate where ChainID=@MyDearID
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 10:04  [ТС] 7
Цитата Сообщение от pincet Посмотреть сообщение
Про Update что нибудь слыхал?
Вы имеете ввиду мой UPDATE который на 32 строке?
Кроме параметра @ChainId нужно добавить еще один параметр @MyDearID?

cmd.Parameters.Add("@MyDearID", SqlDbType.UniqueIdentifier).Value = ??;
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 10:07 8
может пора уже про update что-нибудь почитать, не?
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 10:14  [ТС] 9
Цитата Сообщение от pincet Посмотреть сообщение
может пора уже про update что-нибудь почитать, не?
__________________
Неужели нельзя поконкретнее?

Вот
cmd.CommandText = ("DECLARE @ChainId varchar(100) UPDATE[oktell_manage].[dbo].[okstat_CallChain] SET CallTimeEnd = ('dates.Value()') WHERE[ChainId] = @ChainId", rans.Connection, trans);

Хоть что то путное написано в этой строке?
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 11:43 10
да бред здесь написан. И вообще, идея бредовая, ибо на один ChainId множество timestop
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 12:19  [ТС] 11
Цитата Сообщение от pincet Посмотреть сообщение
да бред здесь написан. И вообще, идея бредовая, ибо на один ChainId множество timestop
ChainId - это столбец, а timestop - его значения - строки

Добавлено через 2 минуты
Вы как то и не поможете и не подскажете а только...
У Вас есть конкретные предложения?

Добавлено через 1 минуту
Немного переписал код, но всё равно не работает(((

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Xml.Linq;
using System.IO;
using System.Web;
 
 
 
class Program
{
    static void Main(string[] args)
    {
        Guid ChainId = Guid.NewGuid(); /// Входной аргумент
 
        using (SqlConnection cnn = new SqlConnection(@"Data Source = ZAPAD_SQL/DEV; Initial Catalog = oktell_manage; Integrated Security = True; Connect Timeout = 15; Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"))
        {
            cnn.Open();
            using (SqlTransaction trans = cnn.BeginTransaction(IsolationLevel.ReadUncommitted))
            {
                SqlCommand cmd = new SqlCommand("DECLARE @ChainId varchar(100); select [ChainId] from [oktell_manage].[dbo].[okstat_CallChain] WHERE [ChainId] = @ChainId", trans.Connection, trans);
                cmd.Parameters.Add("@ChainId", SqlDbType.UniqueIdentifier).Value = ChainId;
                List<DateTime> dates = new List<DateTime>();
                XElement xd;
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                        xd = XElement.Parse(reader[0].ToString());
                    else
                        return;
                    reader.Close();
                }                             
                foreach (XElement prop in xd.Descendants("property_simple"))
                {
                    if ((string)prop.Attribute("key") == "timestop")
                        dates.Add(DateTime.Parse((string)prop.Attribute("value")));
                }                                                                                     
                                                                                                                      
                Guid CallTimeEnd = Guid.NewGuid();
                SqlCommand cmd2 = new SqlCommand("DECLARE @ChainId varchar(100) UPDATE [oktell_manage].[dbo].[okstat_CallChain] SET [CallTimeEnd] = @CallTimeEnd WHERE [ChainId] = @ChainId", trans.Connection, trans);
                cmd2.Parameters.Add("@CallTimeEnd", SqlDbType.DateTime).Value = CallTimeEnd;                                         
                cmd.ExecuteNonQuery();
                trans.Commit();
            }
        }
    }
}
Добавлено через 15 минут
Я так понимаю осталось дописать код в котором из List<DateTime> dates дата передаётся в CallTimeEnd
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 12:24 12
Цитата Сообщение от Alex_trader Посмотреть сообщение
ChainId - это столбец, а timestop - его значения - строки
вот тут замый главный затуп. каким образом ты хочешь (не нарушая 1НФ) впихнуть в поле CallTimeEnd записи с id=ChainID 100500 значений?
Прежде чем махать шашкой и осиливать крупные БД почитал бы азы какие по проектированию БД, потом про SQL, а уж потом доставал напильник и пилил клиентскую часть
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 12:28  [ТС] 13
Цитата Сообщение от pincet Посмотреть сообщение
вот тут замый главный затуп. каким образом ты хочешь (не нарушая 1НФ) впихнуть в поле CallTimeEnd записи с id=ChainID 100500 значений?
Прежде чем махать шашкой и осиливать крупные БД почитал бы азы какие по проектированию БД, потом про SQL, а уж потом доставал напильник и пилил клиентскую часть
Согласен с Вами, но задача поставлена и мне необходимо её выполнить, Вы тоже когда то были новичком)))
Вы имеете ввиду, что в строке 47 неправильный запрос?
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 12:42 14
Цитата Сообщение от Alex_trader Посмотреть сообщение
Вы имеете ввиду, что в строке 47 неправильный запрос?
да, DECLARE там нафик не нужон
Цитата Сообщение от Alex_trader Посмотреть сообщение
Я так понимаю осталось дописать код в котором из List<DateTime> dates дата передаётся в CallTimeEnd
а вот это если и достижимо, то или с нарушением 1НФ 9(сам придумай, как ), или XML
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 13:11  [ТС] 15
Цитата Сообщение от pincet Посмотреть сообщение
да, DECLARE там нафик не нужон
А разве не нужно объявлять переменную?
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 13:19 16
весь код - полный бред
Цитата Сообщение от Alex_trader Посмотреть сообщение
Guid ChainId = Guid.NewGuid(); /// Входной аргумент
всерьез полагаешь найти в таблице запись с уникальным GUID?
Цитата Сообщение от Alex_trader Посмотреть сообщение
SqlCommand cmd = new SqlCommand("DECLARE @ChainId varchar(100); select [ChainId] from [oktell_manage].[dbo].[okstat_CallChain] WHERE [ChainId] = @ChainId", trans.Connection, trans); cmd.Parameters.Add("@ChainId", SqlDbType.UniqueIdentifier).Value = ChainId;
это достойно в анналы. можешь на пальцах объяснить, что мечталось вообще сделать?
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 13:22  [ТС] 17
Цитата Сообщение от pincet Посмотреть сообщение
всерьез полагаешь найти в таблице запись с уникальным GUID?
Это ключевое поле таблицы там все записи уникальны
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 13:23 18

"Пилите, Шура, они золотые" (с)
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
28.01.2016, 13:24  [ТС] 19
sql запрос: выбрать столбец ChainId из таблицы okstat_CallChain где [ChainId] = @ChainId
0
1559 / 1112 / 163
Регистрация: 23.07.2010
Сообщений: 6,280
28.01.2016, 13:33 20
выбрать из таблицы значения поля ChainID для всех записей, у которых значение поля ChainID=@ChainID
чувствуешь разницу?

значение параметра ты устанавливаешь равным GUID.NewGuid()
Ты хоть справку про GUID.NewGuid() удосужился почитать?
Не, рано тебе этим заниматься, рано

Не по теме:


Хорошо хоть начальник не в курсе, чем ты занимаешься

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2016, 13:33
Помогаю со студенческими работами здесь

Процедура сохранения в XML
Привет всем, дайте пожалуйста совет в какую сторону копать, как гуглить, я запросом в манагер SQL...

Как в поле ID одной таблицы записать значение поля ID другой таблицы
В БД две таблицы: 1)USERS с полями ID_User, Name, Password. В нее записываются пользователи...

Переместить два столбца одной таблицы со строкой в поле другой таблицы
Доброго времени суток, добрый форумчанин. Возникла проблема следующего плана: Есть две таблицы:...

Поле таблицы как сумма значений полей другой таблицы
Здравствуйте. В процессе создания БД столкнулся с проблемой, которую сам решить уже не могу. Есть 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru