C# 将DataGridView导出到SQLServer

C# 将DataGridView导出到SQLServer,c#,sql-server,csv,datagridview,export,C#,Sql Server,Csv,Datagridview,Export,我有一个DataGridView,其中包含使用以下代码从.csv文件成功导入的数据。用户可以对DGV中的列重新排序。我需要使用列的显示索引顺序而不是索引顺序将数据导出到SQL Server数据库 private void btn_Upload_Click(object sender, EventArgs e) { char colDelimiter = ','; char rowDelimiter = '\r'; DataTable

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

    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.");

        }

不幸的是,这是我所知道的最好的解决方案:基于dataGridView显示的表创建一个新表。然后用新的数据表替换原来的数据表。我假设在本例中有一个名为table的DataTable

希望这有帮助,我希望有一个更简单的方法,但如果你正在做一个大型的更新命令,这是我知道的最简单的方法

如果您正在使用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;

另外,作为说明,我正在查看最初如何加载.csv

我在基于分隔符进行拆分时遇到了类似的情况,我只是确保在加载.csv的位置包含Schema.ini,然后使用ADO命令填充数据表。这对我来说似乎要快得多

请参阅my Schema.ini,它以逗号分隔:

[tempdata.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=0
以下是include命令:

using System.Data.OleDb;
下面是使用dataAdapter填充填充我的DataTable的C代码,将绑定源设置为DataTable,然后将我的dataGridView的数据源设置为绑定源:

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);
        }
    }

表已经存在还是您也需要创建它?@RyanB表已经存在。但是,不能保证csv中的列名与表中的列名匹配。