【问题标题】:Direct SQL search from an MVC application [closed]从 MVC 应用程序直接搜索 SQL [关闭]
【发布时间】:2014-05-02 21:51:57
【问题描述】:

我正在尝试实现以下功能:

执行一个 SQL 存储过程;它获取数据库中所有表的名称。此存储过程当前在 MVC 应用程序中显示为下拉列表。我希望客户端能够从列表中查询选定的表,例如,如果从列表中选择“组织”表,并且用户输入 Id = 5 并提交,这应该生成一个逗号分隔的行,写它在 CSV 文件中(CSV 文件的名称应为表名)完成导出后,创建一个包含此 CSV 文件的 ZIP 文件。

我真的卡住了,请帮忙。真的很感激。

谢谢。

到目前为止,我已经完成了存储过程部分:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

【问题讨论】:

  • 需要缩小这个问题的范围。听起来你在问三个不同的问题,如何调用存储过程,如何编写 csv 文件,如何编写 zip 文件。从关注下一步开始,如何调用存储过程。这可能会有所帮助:asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/…

标签: c# asp.net sql asp.net-mvc asp.net-mvc-4


【解决方案1】:

有太多问题要回答,所以我会给你一些指示。我只是假设你已经让存储过程正常工作,尽管你可能想look into this 一个存储过程来动态执行查询,所以偷偷摸摸

A CSV writer library to output your file as a download. 我应该提到 csvwriter 的输出是一个逗号分隔的列表。因此,当您执行存储过程时,希望沿着这些行遍历返回的行...

public ActionResult DownloadCsv()
    {
        using (var memStream = new MemoryStream())
        {
            using (var streamWriter = new StreamWriter(memStream))
            {
                var writer = new CsvWriter(streamWriter);

                using (var conn = new SqlConnection(CONNECTION_STRING))
                {
                    var command = new SqlCommand("YourStoredProcedure", conn);
                    command.CommandType = CommandType.StoredProcedure;
                    command.Parameters.AddWithValue("@id", id);
                    conn.Open();

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                Console.WriteLine(reader.GetValue(i));
                                writer.WriteField(reader.GetValue(i));
                            }
                            writer.NextRecord();//you must also do this ALWAYS otherwise your .WriteFields wont be output for the current line
                        }

                    }
                }

                streamWriter.Flush();//note: you must flush


                return File(memStream.ToArray(), "text/csv", "My 1337 download name.csv");
            }
        }

    }

做了一些研究,这里是压缩(没有所有 sql goo),你会need this apparently uber popular library

public ActionResult DownloadCsv()
    {
        using (MemoryStream zippedDownloadStream = new MemoryStream())
        {
            using (ZipFile zip = new ZipFile())
            {
                using (var writerMemoryStream = new MemoryStream())
                {
                    using (var streamWriter = new StreamWriter(writerMemoryStream))
                    {
                        var writer = new CsvWriter(streamWriter);

                        //your writing

                        streamWriter.Flush();
                    }
                    zip.AddEntry("awesome file name.csv", writerMemoryStream.ToArray());

                    zippedDownloadStream.Flush();
                    zip.Save(zippedDownloadStream);
                    return File(zippedDownloadStream.ToArray(), "application/zip", "zippedup.zip");
                }
            }
        }
    }

【讨论】:

  • 谢谢你,我会试试你的指点,Zip文件需要下载,但既然这是最后一步就可以了,只要我先得到其他步骤。我会及时通知你,再次感谢欢呼
猜你喜欢
  • 2010-11-28
  • 2015-12-17
  • 2016-08-13
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多