从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'
有太多的问题要回答,所以我给你一些提示,我只是假设你已经得到了存储过程的工作,尽管你可能想看看这个存储过程动态执行查询,所以偷偷的
一个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");
}
}
}
}