【问题标题】:Exporting dates from mysql table to .CSV将日期从 mysql 表导出到 .CSV
【发布时间】:2017-02-12 05:40:24
【问题描述】:

我尝试将 MySQL 表导出到 .csv,但有些东西不起作用,我不知道它是什么。我首先尝试将日期保存到 DataTable 中,然后使用此函数将它们导出到 .csv:

public void CreateCSVFile(DataTable dtDataTablesList, string strFilePath)
    {
        // Create the CSV file to which grid data will be exported.
        StreamWriter sw = new StreamWriter(strFilePath, false);
        //First we will write the headers.
        int iColCount = dtDataTablesList.Columns.Count;
        for (int i = 0; i < iColCount; i++)
        {
            sw.Write(dtDataTablesList.Columns[i]);
            if (i < iColCount - 1)
            {
                sw.Write("", "");
            }
        }
        sw.Write(sw.NewLine);

        // Now write all the rows.
        foreach (DataRow dr in dtDataTablesList.Rows)
        {
            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    sw.Write(dr[i].ToString());
                }
                if (i < iColCount - 1)
                {
                    sw.Write("", "");
                }
            }
            sw.Write(sw.NewLine);
        }
        sw.Close();
    }

问题是:它通过 sda.Fill(data) 停止:

  • 连接 {MySql.Data.MySqlClient.MySqlConnection} MySql.Data.MySqlClient.MySqlConnection
  • sSql {MySql.Data.MySqlClient.MySqlCommand} MySql.Data.MySqlClient.MySqlCommand
  • sda {MySql.Data.MySqlClient.MySqlDataAdapter} MySql.Data.MySqlClient.MySqlDataAdapter
  • 数据{} System.Data.DataTable

脚本:

MySqlConnection connection = CDBAccess.GetCon;
MySqlCommand sSql = new MySqlCommand("SELECT * from mytable;", connection);
MySqlDataAdapter sda = new MySqlDataAdapter();
sda.SelectCommand = sSql;
DataTable data = new DataTable();
sda.Fill(data);
String path = @"C:\Users\Public\Documents\MyDocument";
CreateCSVFile(data, path);

【问题讨论】:

  • 请用您使用的语言标记。
  • 我的第一个猜测是你的连接有问题。你能验证连接是否有效吗?
  • 连接正常。我得到了另一个使用 exatley 相同脚本和连接详细信息的脚本。一切正常。
  • 我无法理解的是,要么具有值“SELET * from mytable”,变量的值就是“{MySql.Data.MySqlClient.MySqlCommand}”。

标签: c# mysql csv export


【解决方案1】:

尝试使用此代码:

MySqlConnection = CDBAccess.GetCon;
string queryString = "SELECT * from mytable;";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataSet ds = new DataSet();
adapter.Fill(ds, "mytable");
DataTable data = ds.Tables[0];
String path = @"C:\Users\Public\Documents\MyDocument";
CreateCSVFile(data, path);

但是,一般而言,在 Java 代码中对实际表进行迭代既不必要又容易出错。相反,您应该利用 MySQL 公开的 SELECT ... INTO OUTFILE 构造。这样,您就可以让 MySQL 完成将数据编组为 CSV 文件的繁重工作。

只需从您的 Java 代码中执行以下作为原始查询,您就可以开始了:

SELECT *
INTO OUTFILE 'C:/Users/Public/Documents/MyDocument/output.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM mytable

【讨论】:

  • 是的,我已经知道该命令,但问题是文件应该保存在本地而不是 MySQL 服务器上。这就是我想将所有数据添加到 DataTable 并将其导出为 .CSV 的原因。
  • 使用OUTFILE然后从服务器读取输出文件不是更方便吗?
  • 显然是这样,但是 MySQL 服务器没有权限在网络上的其他 PC 上写入文件。所有数据都需要保存在某个地方并由 .exe 而不是服务器本身写入。
【解决方案2】:

好的,我发现了问题。首先,您需要使用 MySqlDataAdapter 将所有内容填充到 DataTable 中。之后,您可以使用数据创建 StringBuilder 并使用函数创建 .CSV 日期。它看起来像这样:

MySqlDataAdapter sda = new MySqlDataAdapter();
                    sda.SelectCommand = cmdDataBase;

                    DataTable data = new DataTable();
                    sda.Fill(data);
                    BindingSource aSource = new BindingSource();
                    aSource.DataSource = data;
                    dataGridView1.DataSource = aSource;
                    sda.Update(data);
                    StringBuilder sb = new StringBuilder();

                    string[] columnNames = data.Columns.Cast<DataColumn>().
                                                      Select(column => column.ColumnName).
                                                      ToArray();
                    sb.AppendLine(string.Join(",", columnNames));

                    foreach (DataRow row in data.Rows)
                    {
                        string[] fields = row.ItemArray.Select(field => field.ToString()).
                                                        ToArray();
                        sb.AppendLine(string.Join(",", fields));
                    }

                    File.WriteAllText("test.csv", sb.ToString());

感谢你们的帮助!

【讨论】:

    【解决方案3】:

    这个 sn-p 可能对人们有所帮助 - 从 mysql 表中生成一个制表符分隔的字符串,然后显示或下载。

            <div >
                   <div style="float:left; margin-left: 20px"> Table to download
                    <asp:DropDownList ID="ddlTable" runat="server">
                         <asp:ListItem Value="components">components</asp:ListItem>
                    </asp:DropDownList></div>
                 <div style="float:left;  margin-left: 20px; margin-top: 5px"><asp:Button ID="btnShow" class="button-main primary-btn"  runat="server" Visible="true" Text="Show" OnClick="btnShow_Click" /></div>
                 <div style="float:left;  margin-left: 20px; margin-top: 5px"><asp:Button ID="btnDownload" class="button-main primary-btn"  runat="server" Visible="true" Text="Download" OnClick="btnDownload_Click" /></div>
            </div>
            <div style="clear: both"></div>
            <div runat="server" id="divOutput"></div>
    
            protected string generate()
            {
                string sql = "";
                string row = "";
                string datatable = "";
                int cols = 0;
                string hdr = "";
    
    
                if (ddlTable.SelectedValue == "components")
                {
                    sql = "SELECT * from components";
                    hdr = "id,category_id,product_code,supplier,description,price,diameter,extra_info\r\n";
                }
    
                datatable = hdr.Replace(',','\t');
    
                using (var connection = DBController.CreateOpenConnection())
                {
                    MySqlCommand cmd = new MySqlCommand(sql, connection);
                    MySqlDataReader dataReader = cmd.ExecuteReader();
                    if (dataReader.HasRows)
                    {
                        while (dataReader.Read())
                        {
                            cols = dataReader.FieldCount;
                            row = "";
                            for (int i = 0; i < cols; i++)
                            {
                                if (i > 0) row += "\t"; // <TAB> separated
                                if (dataReader[i] != null)
                                {
                                    row = row + dataReader[i].ToString();
                                }
                                else
                                {
                                    row = row + "NULL";
                                }
                            }
                            row = row + "\r\n";
                            datatable = datatable + row;
                        }
                    }
                }
                return datatable;
            }
    
            protected void btnDownload_Click(object sender, EventArgs e)
            {
                string data = generate();
    
                string fileName = String.Format("{0}-{1}.csv", ddlTable.SelectedValue, DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
                Response.Clear();
    
                Response.ContentType = "text/csv";
                Response.AddHeader("content-disposition", "filename=" + fileName);
    
                // write string data to Response.OutputStream here
                Response.Write(data);
    
                Response.End();
            }
    
            protected void btnShow_Click(object sender, EventArgs e)
            {
                string data = generate();
    
                divOutput.InnerHtml = "<pre>" +data + "</pre>";
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多