从MVC应用程序直接进行SQL搜索

本文关键字:SQL 搜索 直接进行 应用程序 MVC | 更新日期: 2023-09-27 18:01:20

我想实现以下功能:

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

我真的卡住了,请帮忙。非常感谢。

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

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

从MVC应用程序直接进行SQL搜索

有太多的问题要回答,所以我给你一些提示,我只是假设你已经得到了存储过程的工作,尽管你可能想看看这个存储过程动态执行查询,所以偷偷的

一个CSV编写器库,用于输出您的文件作为下载。我应该提到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的好),你会需要这个显然非常流行的库

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");
                }
            }
        }
    }