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

C# 从MVC应用程序直接进行SQL搜索,c#,asp.net,sql,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Sql,Asp.net Mvc,Asp.net Mvc 4,我正在尝试实现以下功能: 执行SQL存储过程;它获取数据库中所有表的名称。此存储过程当前在MVC应用程序中显示为下拉列表。我希望客户端能够从列表中查询选定的表,例如,如果从列表中选择了组织表,并且用户输入Id=5并提交,这将生成一个逗号分隔的行,将其写入CSV文件中。完成导出后,CSV文件的名称应为表名,创建包含此CSV文件的ZIP文件 我真的卡住了,请帮忙。非常感谢 多谢各位 到目前为止,我已经完成了存储过程部分: SELECT TABLE_NAME FROM INFORMATION_SCH

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

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

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

多谢各位

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

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

有太多的问题要回答,所以我会给你一些提示。我假设你已经让存储过程工作了,尽管你可能想要一个存储过程来动态地执行一个查询,但这太狡猾了

我应该提到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");
            }
        }

    }

我们需要缩小这个问题的范围。实际上,听起来您要问三个不同的问题,如何调用存储过程,如何编写csv文件,如何编写zip文件。首先关注下一步,即如何调用存储过程。这可能会有帮助:谢谢,我会尝试你的指示,Zip文件需要下载,但由于这是最后一步,只要我先完成其他步骤就行。我会通知你的再次感谢干杯
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");
                }
            }
        }
    }