将DataGridView导出到SQLServer

时间:2014-05-23 20:51:48

标签: c# sql-server csv datagridview export

我有一个DataGridView,其中包含使用以下代码从.csv文件成功导入的数据。 DGV中的列可以由用户重新排序。我需要使用列'将数据导出到SQL Server数据库。 DisplayIndex订单而不是索引订单。

    private void btn_Upload_Click(object sender, EventArgs e)
    {
        char colDelimiter = ',';
        char rowDelimiter = '\r';
        DataTable dataTable = new DataTable();


        OpenFileDialog getFile = new OpenFileDialog();
        getFile.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
        getFile.FilterIndex = 1;

        if(getFile.ShowDialog() == DialogResult.OK)
        {
            string fileName = getFile.FileName;
            TextReader reader = new StreamReader(getFile.FileName);
            string[] columns = reader.ReadLine().Split(colDelimiter);

            int x = 0;
            foreach(string c in columns)
            {
                dataTable.Columns.Add(columns[x]);
                x += 1;
            }
            x = 0;

            string[] rows = reader.ReadToEnd().Split(rowDelimiter);
            foreach (string r in rows)
            {
                string[] record = r.Split(colDelimiter);
                dataTable.Rows.Add(record);
            }

            this.dataGridView1.DataSource = dataTable;
            MessageBox.Show(fileName + " was successfully imported.");

        }

2 个答案:

答案 0 :(得分:0)

不幸的是,这是我所知道的最佳解决方案:根据dataGridView显示的表创建一个新表。然后用新的DataTable替换原始DataTable。我假设你在这个例子中有一些名为table的DataTable。

希望这会有所帮助,我希望有一种更简单的方法,但如果您正在执行大型Update()命令,这是我所知道的最简单的方法。

如果你正在做一些用SQL查询手动更新每一行的东西,你可以确保更新基于DisplayIndex和DataGridView,而不是直接基于DataTable。

//Make a new DataTable
DataTable newTable = new DataTable();
//Create Columns based on DataGridView headers
foreach (DataGridViewColumn col in dataGridView1.Columns)
{
    newTable.Columns.Add(col.HeaderText);
}
//Add each row of data from DataGridView into new DataTable in the displayed order
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    DataRow newRow = newTable.NewRow();
    foreach(DataGridViewCell cell in row.Cells)
    {
        newRow[cell.ColumnIndex] = cell.Value;
    }
    newTable.Rows.Add(newRow);
}
//Set your original DataTable to the new DataTable with the correct ordering
table = newTable;

答案 1 :(得分:0)

另外,作为一个注释,我正在研究你最初如何加载.csv ...

我有类似的东西我基于分隔符进行拆分,我只是确保包含一个Schema.ini来加载我的.csv,然后使用ADO命令填充DataTable。这对我来说似乎更快。

请参阅以逗号分割的Schema.ini:

[tempdata.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=0

这是#include命令:

using System.Data.OleDb;

以下是使用dataAdapter Fill()填充我的DataTable的C#代码,将绑定源设置为DataTable,然后将dataGridView的DataSource设置为绑定源:

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + workingPath + ";Extended Properties=\"text;HDR=YES;FMT=Delimited(|)\"";

    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + workingFilename, conn))
        {
            conn.Open();
            OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
            originalTable = new DataTable("");
            dAdapter.Fill(originalTable);
        }
    }