【问题标题】:Insert data in Sql Server from Event Hub using Azure Function使用 Azure 函数从事件中心将数据插入 Sql Server
【发布时间】:2018-03-02 07:42:10
【问题描述】:

我正在使用 Azure 函数从事件中心向 SQL Server 中插入数据。

我编写这段代码是为了在 SQL Server 中插入数据,但我可以每次执行只能插入一条消息

public static void Run(string[] eventHubMessages, TraceWriter log)
{

  SqlConnection cnn = new SqlConnection();
  cnn.ConnectionString = /* my connection string */;
  cnn.Open();

  log.Info("Connection open");

  foreach(var item in eventHubMessages)
  {
    if(item.StartsWith("{") && item.EndsWith("}"))
    {
       SqlCommand cmd = new SqlCommand("TelemetriaAttiva.ImportEvents", cnn); // call stored procedure
       cmd.Parameters.AddWithValue("Events", item);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.ExecuteNonQuery();
    }
  }
}

存储过程代码为:

CREATE PROCEDURE [TelemetriaAttiva].[ImportEvents]  @Events NVARCHAR(MAX)
AS  BEGIN 
INSERT INTO TelemetriaAttiva.Events (IDType, PayloadType, SerialNumber, Cid, 
Year, Month, Day, Hour, Minute, Second, Sid, InsDate, InsUser) 
SELECT idtype, payloadtype, serialnumber, cid, year, month, day, hour, 
minute, second, sid, insdate, insuser FROM OPENJSON(@Events)
WITH(
    IDType varchar(50) '$.idtype',
    PayloadType varchar(50) '$.payloadtype',
    SerialNumber varchar(50) '$.serialnumber',
    Cid varchar(50) '$.cid',
    Year varchar(50) '$.year',
    Month varchar(50) '$.month',
    Day varchar(50) '$.day',
    Hour varchar(50) '$.hour',
    Minute varchar(50) '$.minute',
    Second varchar(50) '$.second',
    Sid varchar(50) '$.sid',
    InsDate varchar(50) '$.insdate',
    InsUser varchar(100) '$.insuser'
) 
END 
GO

有人可以帮我在 Sql Server 上插入 Event Hub 内部的所有数据吗?

非常感谢!

【问题讨论】:

  • 在c#中搜索批量插入,c-sharpcorner.com/UploadFile/0c1bb2/…
  • 如果你必须调用一个SP并且你不能改变它,那么就没有办法同时为所有事件调用它。如果可以更改,请说明它的作用以及如何更改。
  • 在您的 cmd.ExecuteNonQuery() 之后添加一条日志语句 - 如果每条消息都有一个日志条目,那么您的问题就在某处的存储过程中。能发一下proc的代码吗?
  • @MurrayFoxcroft 我贴出存储过程的代码
  • Proc 看起来不错 - 您是否也添加了日志条目?您收到预期的消息数量了吗?

标签: c# sql-server azure azure-functions azure-eventhub


【解决方案1】:

所以,看来您可以尝试以下方法:

  1. 将所有消息合并到一个 JSON 数组中,例如

    var items = $"[{string.Join(",", eventHubMessages)}]";
    
  2. 一次调用将它们全部传递给存储过程(与现在调用相同,但没有任何foreach 循环)

    cmd.Parameters.AddWithValue("Events", items);
    
  3. 调整您的存储过程以期望 JSON 中的项目数组而不是单个项目。

【讨论】:

  • 非常感谢!现在我试试:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2019-11-22
  • 2012-01-31
相关资源
最近更新 更多