使用 C# 使用 CSV 文件填充 DataGridView,并使用结果更新 Access 数据库

Posted

技术标签:

【中文标题】使用 C# 使用 CSV 文件填充 DataGridView,并使用结果更新 Access 数据库【英文标题】:Using C# to populate a DataGridView with CSV file, and update Access database with results 【发布时间】:2012-11-26 19:33:42 【问题描述】:

我有一个与 Access 数据库 (accdb) 交互的 C# Windows 窗体项目。我有一个表格可以很好地读取数据库,并将其显示到 DataGridView 中。我有另一个表单,可以将文本框信息提交到数据库中。

我有另一个表单(见下图),允许用户单击按钮(按钮 1)打开 CSV 文件,使用“openFileDialog”,并在表单的 dataGridView 中显示所选文件的内容 (示例如下)

我的目标:我想要一个按钮(按钮 3),在同一个表单上,将 dataGridView 的显示结果提交到前面提到的 Access 数据库中。

看来我已经拥有了我需要的所有组件。感觉好像我离得太远了,但我的代码中似乎仍然存在错误和/或缺失。几周以来,我一直在努力实现这一目标。请帮忙!!!

这是表单的屏幕截图和表单的完整代码。非常感谢所有帮助!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Globalization;
using System.Configuration;
using System.Data.OleDb;

namespace csvToGrid

    public partial class Import : Form
        
            public Import()
                
                    InitializeComponent();
                
        public void button1_Click(object sender, EventArgs e)
            
                string delimiter = ",";
                string tablename = "medTable";
                DataSet dataset = new DataSet();
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                openFileDialog1.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
                openFileDialog1.FilterIndex = 1;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    
                        if (MessageBox.Show("Are you sure you want to import the data from \n " + openFileDialog1.FileName + "?", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            
                                filename = openFileDialog1.FileName;
                                StreamReader sr = new StreamReader(filename);
                                string csv = File.ReadAllText(openFileDialog1.FileName);
                                dataset.Tables.Add(tablename);
                                dataset.Tables[tablename].Columns.Add("Prescription");
                                dataset.Tables[tablename].Columns.Add("Customer Name");
                                dataset.Tables[tablename].Columns.Add("Medication");
                                dataset.Tables[tablename].Columns.Add("Quantity");
                                dataset.Tables[tablename].Columns.Add("Date Filled");

                                string allData = sr.ReadToEnd();
                                string[] rows = allData.Split("\r".ToCharArray());

                                foreach (string r in rows)
                                    
                                        string[] items = r.Split(delimiter.ToCharArray());
                                        dataset.Tables[tablename].Rows.Add(items);
                                    
                                this.dataGridView1.DataSource = dataset.Tables[0].DefaultView;
                                MessageBox.Show(filename + " was successfully imported. \n Please review all data before sending it to the database.", "Success!", MessageBoxButtons.OK);
                            
                        else
                            
                                this.Close();
                            
                
            

        public string filename  get; set; 


        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
            

            

        private void Import_Load(object sender, EventArgs e)
            

            

        private void button4_Click(object sender, EventArgs e)
        
            Application.Exit();

        

        private void button2_Click(object sender, EventArgs e)
        
            this.Close();
        

        private void button3_Click(object sender, EventArgs e)

            //remove the semicolon, and add brackets below after line
               
                //create the connection string
                string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Search\\Database.accdb";
                //create the database query
                string query = "SELECT * FROM script_Orders";
                //create an OleDbDataAdapter to execute the query
                OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString);
                //create a command builder
                OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);
                //create a DataTable to hold the query results
                DataTable dTable = new DataTable();
                //fill the DataTable
                dAdapter.Fill(dTable);
                //the DataGridView
                DataGridView dataGridView1 = new DataGridView();
                //BindingSource to sync DataTable and DataGridView
                BindingSource bSource = new BindingSource();
                //set the BindingSource DataSource
                bSource.DataSource = dTable;
                //set the DataGridView DataSource
                dataGridView1.DataSource = bSource;
                // An update function to get the changes back into the database.
                dAdapter.Update(dTable);
            

        
    

欢迎提供示例!

【问题讨论】:

这是您想要的一个很好的示例,但您未能解释您遇到的实际问题/错误是什么您是否遇到任何错误?如果是这样,请说明错误是什么.. 大负面,我的朋友。点击上图表格中的“按钮1”,并成功将CSV文件导入dataGridView后,没有Warnings、Errors或Messages。 @DJKRAZE 导入成功,其中包含“\r”。请注意以下内容:string delimiter = ","; 我遇到的问题是后面的代码:public void button1_Click(object sender, EventArgs e) 假设从 CSV 导入的所有行都将插入访问表中是否安全?还是您也在更新行? @ConradFrix 我打算导入所有行。只是仍在试图弄清楚如何。 :-) 【参考方案1】:

挑战来自使用数据集对象来处理数据,而 CSV 文件位于 Access 数据库外部。要解决此问题,您可以以编程方式将更新从 DataGridView 持久保存到 Access 数据库。

插入示例

DataRow anyRow = DatasetName.ExistingTable.NewRow();
anyRow.FirstName = "Jay";
anyRow.LastName = "Stevens";
ExistingTable.Rows.Add(anyRow);

更新示例

dsCustomers1.Customers[4].CompanyName = "Wingtip Toys";
dsCustomers1.Customers[4].City = "Buffalo";

删除示例

dsCustomers1.Customers.Rows[0].Delete();

希望这会有所帮助。干杯。

【讨论】:

您输入的内容非常合理。那么,我想我的下一个问题是:“我是否需要在我的代码中执行 insertupdate,以便数据进入数据库并更新它也一样?”如果不是,我应该使用哪个,以及在我的代码中的什么位置插入它?感谢您的回复! 只要数据在写入数据库之前发生变化,只需要插入即可。否则,您也需要更新。您可以将代码放在 button3_Click 事件中。 我是否可以安全地假设在我将数据写入数据库之前将其更改,因为我将首先从 CSV 导入它? 是的,你可以做出这样的假设。 @Geo,如果我的回答帮助您解决了问题,那么请将其标记为所选答案。干杯。【参考方案2】:

假设您想要做的只是获取 CSV 的内容并将它们插入到您的表中,您可以遍历数据集并调用插入命令(当然使用参数化查询)

var AccessCnn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=0;Persist Security Info=False;", @"C:\YOURDBNAME.accdb");

using (OleDbConnection accessCnn = new OleDbConnection(AccessCnn))



    //Create The Command
    var accessCmd = new OleDbCommand(@"INSERT INTO script_Orders  
                                       (Prescription, [Customer Name], Medication, Quantity, [Date Filled])
                                    VALUES (?,?,?,?,?)", accessCnn);

   foreach(var row in dataset.Tables["medTable"].Rows)
   
      accessCmd.Parameters.Clear();

      accessCmd.Parameters.AddWithValue("?", row["Prescription"]);
      accessCmd.Parameters.AddWithValue("?", row["Customer Name"]);
      accessCmd.Parameters.AddWithValue("?", row["Medication"]);
      accessCmd.Parameters.AddWithValue("?", row["Quantity"]);
      accessCmd.Parameters.AddWithValue("?", row["Date Filled"]);

      ccessCmd.ExecuteNonQuery();
   



您需要将 DataSet 移动为类级变量

public partial class Import : Form

     DataSet dataset;

然后稍后在 button1_Click 中分配它而不是声明和分配它

string tablename = "medTable";
dataset = new DataSet();                        

【讨论】:

【参考方案3】:

您需要考虑为您的数据适配器创建一个 UPDATE 命令。

下面的指南将帮助您更好地了解数据适配器:-

http://msdn.microsoft.com/en-us/library/33y2221y.aspx

祝你好运!!

【讨论】:

以上答案是为了您对如何插入和更新的评论

以上是关于使用 C# 使用 CSV 文件填充 DataGridView,并使用结果更新 Access 数据库的主要内容,如果未能解决你的问题,请参考以下文章

C# Windows 窗体(非 SQL):在新窗体上用整数 +1 填充 DataGridView 行中当前最高数字的文本框

使用 Cloud 功能将 TXT 文件转换为 CSV 并在 Google BigQuery 中填充数据

C# 将 csv 转换为 xls(使用现有的 csv 文件)

使用 C# 将 csv 文件转换为 json

上传 .csv 或 .txt 文件以填充 QTableView

使用 C# 在 XML 文件中转换 CSV