【问题标题】:ssis generate json file remove returnssis 生成 json 文件删除返回
【发布时间】:2019-06-01 05:52:43
【问题描述】:

我正在使用脚本任务从 sql 查询生成 json 文件。

脚本任务中的c#代码:

public void Main()
{
    // TODO: Add your code here

    ConnectionManager cm;
    string sqlString = "";

    System.IO.StreamWriter file = new System.IO.StreamWriter(@"f:\JSONOutput.txt");

    sqlString = "SELECT * FROM[dbo].[JJVCACUProductElectron] where id in (1,2,3) for json auto";
    System.Data.SqlClient.SqlConnection sqlConn;
    System.Data.SqlClient.SqlCommand sqlComm;

    cm = Dts.Connections["crm_vm_2017_cs_dotnet"];

    sqlConn = (System.Data.SqlClient.SqlConnection)cm.AcquireConnection(Dts.Transaction);
    sqlComm = new System.Data.SqlClient.SqlCommand(sqlString, sqlConn);
    System.Data.SqlClient.SqlDataReader reader = sqlComm.ExecuteReader();
    try
    {
while (reader.Read())
{

    file.WriteLine(reader[0]);
}
    }
    finally
    {
// Always call Close when done reading.
reader.Close();
    }

    cm.ReleaseConnection(sqlConn);
    Dts.TaskResult = (int)ScriptResults.Success;
}

生成的输出文件不完整,我猜有些列可能有返回。如何去除输出中的返回字符?

【问题讨论】:

  • “生成的输出文件不完整”是什么意思?你怎么知道它不完整。您需要跟踪您的代码并找出它从完整到不完整的位置。
  • 你的代码写了多行。这是否意味着每行编写一个 JSON 实体?为了简化,首先只为一个记录WHERE id = 1写JSON,看看是否有效
  • 查询假设只返回一列一行的数据。我发现它实际上返回了带有 crlf 的数据,因此这可能会导致上述代码返回部分 json 数据。所以我在问如何从输出中删除crlf,所以输出变成一个没有crlf的字符串。
  • 你检查过它只返回一列一行吗?该代码允许多行,SQL 显然是为了返回多行。你需要再次检查你得到了什么。

标签: c# json sql-server ssis etl


【解决方案1】:

解决方法

您可以从 SQL 命令中删除for json auto 部分并将数据导入DataTable,然后将DataTable 导出到Json 文件。

将数据导入DataTable

导出数据表到 Json 文件

【讨论】:

    【解决方案2】:

    工作代码:从 select ... for json auto 发送数据时,sql server 似乎会自动以特定大小吐出行。但是行尾没有crlf。所以file.write方法可以不断的把字符串串联起来,在文件中形成一个大的单行字符串,就是有效的json文件。我之前的代码使用了 writeline,它可能在每个字符串的末尾添加了 crlf。关键是 using (file) 部分,否则会看到输出文件被截断,这是我原帖中的问题。

            public void Main()
            {
                ConnectionManager cm;
    
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"e:\jsontest"))
                {
                    System.Data.SqlClient.SqlConnection sqlConn;
                    System.Data.SqlClient.SqlCommand sqlComm;
    
                    cm = Dts.Connections["crm_vm_2017_cs_dotnet"];
    
                    sqlConn = (System.Data.SqlClient.SqlConnection)cm.AcquireConnection(Dts.Transaction);
                    sqlComm = new System.Data.SqlClient.SqlCommand("select * from JJVCProduct for json auto", sqlConn);
                    System.Data.SqlClient.SqlDataReader reader = sqlComm.ExecuteReader();
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    try
                    {
                        while (reader.Read())
                        {
                            file.Write(reader.GetValue(0).ToString());
                        }
    
                    }
                    finally
                    {
                        reader.Close();
                    }
    
                    cm.ReleaseConnection(sqlConn);
                    Dts.TaskResult = (int)ScriptResults.Success;
                }
    
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多