【问题标题】:C# console application call a stored procedure and output file in csv fileC# 控制台应用程序调用存储过程并在 csv 文件中输出文件
【发布时间】:2015-04-23 17:04:00
【问题描述】:

我正在尝试用 c# 构建一个控制台应用程序,结果我想将它放入一个 csv 文件中。

当我执行代码时,什么也没有发生。当我尝试调试时,我无法确定可能发生的情况。

这是控制台代码

namespace ConsoleOutputFile
{
    class Program
    {
        static void Main(string[] args)
        {


            try
            {
                using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString))
                {
                    var outCsvFile = @"C:\test\result.csv";
                    SqlCommand sqlCmd = new SqlCommand();
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.Connection = conn;
                    sqlCmd.CommandText = "ExportTasks";

                    conn.Open();

                    DataSet dsData = new DataSet();
                    DataTable dt = new DataTable();
                    SqlDataAdapter da = new SqlDataAdapter(sqlCmd);


                    File.WriteAllText(outCsvFile, dt.Columns[0].ToString());

                    da.Fill(dsData);
                    conn.Close();
                }

            }
            catch (Exception)
            {
            }
        }
    }
}

这是我的 app.config 文件

<?xml version="1.0"?>
<configuration>
    <startup> 

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup>
  <connectionStrings>
    <add connectionString="Server=TestServer;database=test;user=sa;pwd=test" name="Connection"/>
  </connectionStrings>
</configuration>

【问题讨论】:

  • 这很有道理,你吃的是例外。调试的第一步是读取错误。试试catch(Exception e) { Console.WriteLine(e.Message); } 作为你的收获。或者只是使用一个断点
  • 您使用的是什么数据库服务器? MySQL?如果是这样,我认为user 部分是错误的,因为MySQL 使用Uid 而不是user
  • 我使用的是 SQL Server 2008
  • 您在调用 da.Fill(dsData) 之前正在写入文件。在写入文件之前填写数据表:

标签: c# csv stored-procedures console output


【解决方案1】:

您正在转储一个空数据表。您在任何时候都没有填充数据表 (dt)。做这样的事情:

DataSet dsData = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
da.Fill(dsData);
File.WriteAllText(outCsvFile, dsData.Tables[0].Columns[0].ToString());                    

快乐编码:)

【讨论】:

  • 您好,我接受了您的建议,但我仍然收到一个空文件,我已将您的建议放在 conn.Open() 之后;
  • 您的过程是否在 SQL Server Management Studio 中工作?您需要验证您的过程是否返回数据,否则我建议的代码应该可以正常工作。我更喜欢使用数据读取器: SqlDataReader reader = sqlCmd.ExecuteReader();使用 (System.IO.StreamWriter file = new System.IO.StreamWriter(outCsvFile)) { while (reader.Read()) file.WriteLine(reader[0].ToString()); }
  • 嗨,它的工作。使用您的存储过程时,存储过程会返回我的数据,但它只返回一列。根据调试,它有 24 列
  • 根据存储过程,我需要传递一些参数,所以我必须添加sqlCmd.Parameters.AddWithValue。我需要将这些参数返回到问题的列中
  • 嗨,我终于让它工作了,我刚刚添加了 reader[0].ToString() + ',' + reader[1].ToString() ....等等,直到我达到我的栏目总数。现在唯一缺少的是将标题添加到每一列,知道吗?
【解决方案2】:

从这里开始:如果在 try 内部抛出异常,您会捕获它但不对其进行任何处理。在里面放一些有助于调试的东西。异常有一个属性,Message,所以你可以在控制台写Message

        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

无论是谁抛出异常,他们都可能会提供有用的消息。将其写入控制台将有助于您的工作。

接下来,为您的解决方案添加一个断点。当您运行它时,调试器将在断点处停止。使用F10 一次通过一行。这也将帮助您找出问题所在。更多关于 here.

【讨论】:

  • 嗨,我能够显示一条消息,上面写着“找不到第 0 列”
【解决方案3】:

您初始化但从未填充您的数据表。考虑使用 DataReader 执行查询,然后使用结果加载数据表

SqlDataReader dr = dalMgr.SqlCommand.ExecuteReader();
dt.Load(dr);

或完全取消数据表并

string output = dr["column_name"].ToString();

【讨论】:

  • 您好尝试了第一个选项,但它说 dalMgr 在当前上下文中不存在
  • SqlDataReader dr = sqlCmd.ExecuteReader(); msdn.microsoft.com/en-us/library/…
  • 我正在执行控制台,我得到了 csv 文件,但它只包含一个工作“任务”,它不包含任何其他内容。我用错了什么?
  • 结果集中返回什么?你最终使用了哪种方法?请提供更多细节。
  • 您好,抱歉,如果我没有提供更多详细信息。我使用了第一种方法,并在 File.WriteAllText 之前将其插入...当我进行调试时,它会显示我的列数,但文件不包含任何内容(只有一行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多