Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过C语言中的OPC UA客户端,使用ADO.NET实体数据模型插入数据库#_C#_Entity Framework_Opc_Opc Ua - Fatal编程技术网

C# 通过C语言中的OPC UA客户端,使用ADO.NET实体数据模型插入数据库#

C# 通过C语言中的OPC UA客户端,使用ADO.NET实体数据模型插入数据库#,c#,entity-framework,opc,opc-ua,C#,Entity Framework,Opc,Opc Ua,我正在尝试使用ADO.NET实体数据模型和来自的示例客户端写入数据库。我是C#的新手,我的问题是lamda表达式: list.ForEach(i => i.Notification += OnNotification); 当服务器上的某个值发生更改时,客户端将收到实际值(称为订阅)。下面的函数显示通知功能OnNotification private static void OnNotification(MonitoredItem item, MonitoredItemNotificati

我正在尝试使用ADO.NET实体数据模型和来自的示例客户端写入数据库。我是C#的新手,我的问题是lamda表达式:

list.ForEach(i => i.Notification += OnNotification);
当服务器上的某个值发生更改时,客户端将收到实际值(称为订阅)。下面的函数显示通知功能
OnNotification

private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
    foreach (var value in item.DequeueValues())
    {
        Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
    }
}
函数的输出如下所示:

Column01: 4545, 11.12.2017 13:34, Good
Column02: 6767, 11.12.2017 13:34, Good
Column01: 4456, 11.12.2017 13:35, Good 
Column02: 5554, 11.12.2017 13:35, Good 
Column02: 6664, 11.12.2017 13:36, Good
Column01: 6233, 11.12.2017 13:37, Good 
Column02: 5123, 11.12.2017 13:37, Good 
private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
    {
        Entities context = new Entities();
        dbName objData = new dbName();

        objData.SourceTimestamp = System.DateTime.Now;

        foreach (var value in item.DequeueValues())
        {
            switch (item.DisplayName)
            {
                case "Column01":
                    objData.Column01 = Convert.ToInt16(value.Value);
                    break;

                case "Column02":
                    objData.Columns02 = Convert.ToInt16(value.Value);
                    break;

                default:
                    Console.WriteLine("Unknown Displayname: {0}", item.DisplayName);
                    break;
            }

        }
        context.dbName.Add(objData);
        context.SaveChanges();

    }
SourceTimestamp  | Column01 | Column02
11.12.2017 13:34 | 4545     | NULL
11.12.2017 13:34 | NULL     | 6767
11.12.2017 13:35 | 4456     | NULL
11.12.2017 13:35 | NULL     | 5554
11.12.2017 13:36 | NULL     | 6664
11.12.2017 13:37 | 6233     | NULL
11.12.2017 13:37 | NULL     | 5123
值更改时生成输出,并一直持续到您按键为止。请注意,有时列不会出现,因为值保持不变。在这种情况下,可以将该值作为NULL添加到数据库中

为了将数据传输到数据库,我只想将
OnNotification
函数修改为如下内容:

Column01: 4545, 11.12.2017 13:34, Good
Column02: 6767, 11.12.2017 13:34, Good
Column01: 4456, 11.12.2017 13:35, Good 
Column02: 5554, 11.12.2017 13:35, Good 
Column02: 6664, 11.12.2017 13:36, Good
Column01: 6233, 11.12.2017 13:37, Good 
Column02: 5123, 11.12.2017 13:37, Good 
private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
    {
        Entities context = new Entities();
        dbName objData = new dbName();

        objData.SourceTimestamp = System.DateTime.Now;

        foreach (var value in item.DequeueValues())
        {
            switch (item.DisplayName)
            {
                case "Column01":
                    objData.Column01 = Convert.ToInt16(value.Value);
                    break;

                case "Column02":
                    objData.Columns02 = Convert.ToInt16(value.Value);
                    break;

                default:
                    Console.WriteLine("Unknown Displayname: {0}", item.DisplayName);
                    break;
            }

        }
        context.dbName.Add(objData);
        context.SaveChanges();

    }
SourceTimestamp  | Column01 | Column02
11.12.2017 13:34 | 4545     | NULL
11.12.2017 13:34 | NULL     | 6767
11.12.2017 13:35 | 4456     | NULL
11.12.2017 13:35 | NULL     | 5554
11.12.2017 13:36 | NULL     | 6664
11.12.2017 13:37 | 6233     | NULL
11.12.2017 13:37 | NULL     | 5123
现在我可以将值插入Column01和Column02,但只能插入不同的行。因此,数据库中的表如下所示:

Column01: 4545, 11.12.2017 13:34, Good
Column02: 6767, 11.12.2017 13:34, Good
Column01: 4456, 11.12.2017 13:35, Good 
Column02: 5554, 11.12.2017 13:35, Good 
Column02: 6664, 11.12.2017 13:36, Good
Column01: 6233, 11.12.2017 13:37, Good 
Column02: 5123, 11.12.2017 13:37, Good 
private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
    {
        Entities context = new Entities();
        dbName objData = new dbName();

        objData.SourceTimestamp = System.DateTime.Now;

        foreach (var value in item.DequeueValues())
        {
            switch (item.DisplayName)
            {
                case "Column01":
                    objData.Column01 = Convert.ToInt16(value.Value);
                    break;

                case "Column02":
                    objData.Columns02 = Convert.ToInt16(value.Value);
                    break;

                default:
                    Console.WriteLine("Unknown Displayname: {0}", item.DisplayName);
                    break;
            }

        }
        context.dbName.Add(objData);
        context.SaveChanges();

    }
SourceTimestamp  | Column01 | Column02
11.12.2017 13:34 | 4545     | NULL
11.12.2017 13:34 | NULL     | 6767
11.12.2017 13:35 | 4456     | NULL
11.12.2017 13:35 | NULL     | 5554
11.12.2017 13:36 | NULL     | 6664
11.12.2017 13:37 | 6233     | NULL
11.12.2017 13:37 | NULL     | 5123
但我想:

SourceTimestamp  | Column01 | Column02
11.12.2017 13:34 | 4545     | 6767
11.12.2017 13:35 | 4456     | 5554
11.12.2017 13:36 | NULL     | 6664
11.12.2017 13:37 | 6233     | 5123

问题是lambda表达式的循环,我无法控制它,我不知道如何处理这个问题。我只需要得到一条订阅消息,将它们声明到列变量中,并将它们添加到数据库中,但这对我来说似乎有点棘手,而且我似乎无法解决这个问题,因为我缺乏C#方面的经验。欢迎提出建议或其他解决方案。提前感谢。

Ii似乎每个“MonitoredItem”在队列中对于每个事件只有一个值。 这就是为什么你会

Column01: 4545, 11.12.2017 13:34, Good
Column02: 6767, 11.12.2017 13:34, Good
Column01: 4456, 11.12.2017 13:35, Good 
Column02: 5554, 11.12.2017 13:35, Good 
Column02: 6664, 11.12.2017 13:36, Good
Column01: 6233, 11.12.2017 13:37, Good 
Column02: 5123, 11.12.2017 13:37, Good
作为输出。MonitoredItem似乎有一个唯一的标识符:CientHandle


因此,在事件处理程序中,必须使用该标识符测试现有dbName对象的数据上下文,并更新该对象(如果存在)。如果不存在,则使用要更新的标识符创建一个新的dbName对象。

Ii似乎每个“MonitoredItem”在队列中对于每个事件只有一个值。 这就是为什么你会

Column01: 4545, 11.12.2017 13:34, Good
Column02: 6767, 11.12.2017 13:34, Good
Column01: 4456, 11.12.2017 13:35, Good 
Column02: 5554, 11.12.2017 13:35, Good 
Column02: 6664, 11.12.2017 13:36, Good
Column01: 6233, 11.12.2017 13:37, Good 
Column02: 5123, 11.12.2017 13:37, Good
作为输出。MonitoredItem似乎有一个唯一的标识符:CientHandle


因此,在事件处理程序中,必须使用该标识符测试现有dbName对象的数据上下文,并更新该对象(如果存在)。如果不存在,则使用要更新的标识符创建一个新的dbName对象。

对于数据记录,我只需创建一个循环,读取值,将其写入数据库,稍等片刻,然后重复

那么所有的值都有相同的时间戳

ps:有些人可能会先使用RegisterNodes,但这不是必须的

pps:这里有一些代码

```


```

对于数据记录,我只是创建一个循环,读取值,将它们写入数据库,等等,重复

那么所有的值都有相同的时间戳

ps:有些人可能会先使用RegisterNodes,但这不是必须的

pps:这里有一些代码

```



```

如果我没弄错的话,你能添加你打印的第一段代码的输出吗:
{0}:{1}、{2}、{3}
,出现问题的原因是您在switch语句中使用了
item.DisplayName
,而不是
value.DisplayName
。我想使用类似于
value.DisplayName
的东西,但没有这样的东西。只有
item.DisplayName
可以迭代,我不知道如何迭代。我只是对这个脚本的迭代感到困惑。我明白了,现在我明白发生了什么。我不认为您可以在这个方法中执行,因为它似乎是针对每一行执行的。但是您希望合并到一起的行。您可以添加打印的第一段代码的输出:
{0}:{1}、{2}、{3}
,如果我没有弄错的话,出现问题的原因是您在switch语句中使用了
item.DisplayName
,而不是
value.DisplayName
。我想使用类似于
value.DisplayName
的东西,但没有这样的东西。只有
item.DisplayName
可以迭代,我不知道如何迭代。我只是对这个脚本的迭代感到困惑。我明白了,现在我明白发生了什么。我不认为您可以在这个方法中执行,因为它似乎是针对每一行执行的。但是你想把行合并在一起。循环是什么样子的?它是在通知功能的外部还是内部?问题是像@gldraphael所说的那样,对每一行调用
OnNotification
。我是否应该创建一个全局列表,向其中添加项目并将这些项目推送到数据库中?无订阅或通知。你是我的英雄!这个循环看起来怎么样?它是在通知功能的外部还是内部?问题是像@gldraphael所说的那样,对每一行调用
OnNotification
。我是否应该创建一个全局列表,向其中添加项目并将这些项目推送到数据库中?无订阅或通知。你是我的英雄!你能给我看一些示例代码吗?因为我不确定如何处理带有标识符的事件处理程序?看起来您已经选择了Andrew的答案,尽管我看不出它是否符合您的问题。结果正好符合。我找到了另一种将数据插入数据库的方法。您能展示一些示例代码吗?因为我不确定如何处理带有标识符的事件处理程序?看起来您已经选择了Andrew的答案,尽管我看不出它是否符合您的问题。结果正好符合。我找到了另一种将数据插入数据库的方法。