C#SQLDataAdapter更新不更新数据库

C#SQLDataAdapter更新不更新数据库,c#,C#,我脑子里有一个相对简单的任务,但比预期的要困难得多,因为我无法让它工作。我在C#中工作,试图将csv文件中的数据解析到DataTable中,然后将其插入SQL数据库。我想这样做,以便我可以从数据库文件在未来的工作(我希望它会更快,更容易比CSV文件,但请告诉我,如果这是一个坏的假设) 我可以把数据输入数据表。然后我重命名这些列以匹配数据库文件中的内容。然后我创建一个数据集并将datatable添加为数据集的“Table1” 但是,当我从sqldataadapter调用“Update”方法时,代码

我脑子里有一个相对简单的任务,但比预期的要困难得多,因为我无法让它工作。我在C#中工作,试图将csv文件中的数据解析到DataTable中,然后将其插入SQL数据库。我想这样做,以便我可以从数据库文件在未来的工作(我希望它会更快,更容易比CSV文件,但请告诉我,如果这是一个坏的假设)

我可以把数据输入数据表。然后我重命名这些列以匹配数据库文件中的内容。然后我创建一个数据集并将datatable添加为数据集的“Table1”

但是,当我从sqldataadapter调用“Update”方法时,代码运行良好,只是数据库中的数据似乎没有更新!我猜我只是犯了一些小的愚蠢的错误,所以我道歉,因为我是C#和OOP的新手

下面是我尝试使用的代码:

    SqlConnection con;
    DataTable dt1;
    SqlDataAdapter da;

    private void Form1_Load(object sender, EventArgs e)
    {
        con = new SqlConnection();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\dbTestCSV.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
        con.Open();

        string sql = "SELECT * FROM tblTestCSV";
        da = new SqlDataAdapter(sql, con);

        SqlCommandBuilder cb;
        cb = new SqlCommandBuilder(da);

        dt1 = ParseCSV("C:\\testcsv2.csv");

        dt1.Columns[0].ColumnName = "Numbers";
        dt1.Columns[1].ColumnName = "Col1";
        dt1.Columns[2].ColumnName = "Col2";
        dt1.Columns[3].ColumnName = "Col3";
        dt1.Columns[4].ColumnName = "Col4";
        dt1.Columns[5].ColumnName = "Col5";

        foreach (DataRow dr in dt1.Rows)
        {
            dr.SetModified();
        }

        DataSet ds1 = new DataSet();
        ds1.Tables.Add(dt1);


        da.Fill(ds1);
        da.Update(ds1,"Table1");

        dataGridView1.DataSource = dt1;

        con.Close();
        da.Dispose();

        MessageBox.Show("sql server table data updated!");
    }
我已经浏览了互联网和stackoverflow,但是我遇到的所有解决方案我要么不理解,要么不起作用。谢谢你抽出时间

编辑:我对代码做了一些修改,这样我就不会在命令生成器之后重新说明数据适配器。然而,它仍然没有更新数据库,尽管代码运行时没有抛出任何东西,并且最后弹出messagebox,后面是我的表单和dt1中的数据

澄清一下,我没有从数据库中获取数据。我试图从CSV文件中获取数据并将其移动到数据库中。谢谢你迄今为止的帮助。还有其他建议吗

编辑2:数据表“dt1”的结构如下:

标题:编号Col1 Col2 Col3 Col4 Col5

数据类型:int32 Str

有25排

dbTestCsv.mdf文件中的表格如下所示:

标题:编号Col1 Col2 Col3 Col4 Col5

数据类型:int nvarchar(50)-->

还没有行/数据


编辑3:Heyooo!!让它工作起来。这里基本上是一个建议的集合体,所以谢谢大家

首先需要使用SqlDataAdapter填充数据集,然后调用update方法

e.g. ds1.Fill(da); 

我认为您最好使用通用代码创建DataTable来填充数据集,然后添加csv文件中的值,这样他就可以根据自己的第一个状态检测到新的数据表,在这种情况下,更新将起作用。

希望对您有所帮助

以下是最终有效的代码。数据现在约有24000行(仅用于测试),并相应地更新数据库(编译/运行大约需要4秒)。谢谢你的帮助

    SqlConnection con;
    DataTable dt1;
    SqlDataAdapter da;

    private void Form1_Load(object sender, EventArgs e)
    {
        con = new SqlConnection();
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\dbTestCSV.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
        con.Open();

        string sql = "SELECT * FROM tblTestCSV";
        da = new SqlDataAdapter(sql, con);

        SqlCommandBuilder cb;
        cb = new SqlCommandBuilder(da);

        dt1 = ParseCSV("C:\\testcsv3.csv");

        dt1.Columns[0].ColumnName = "Numbers";
        dt1.Columns[1].ColumnName = "Col1";
        dt1.Columns[2].ColumnName = "Col2";
        dt1.Columns[3].ColumnName = "Col3";
        dt1.Columns[4].ColumnName = "Col4";
        dt1.Columns[5].ColumnName = "Col5";

        DataSet ds2 = new DataSet();

        da.Fill(ds2);

        // THIS IS THE KEY BIT!! This adds the rows from the datatable to the dataset one by one.
        // I guess the "Update" command in the dataadapter needs this to happen, rather than just 
        // adding the table "dt1" to the dataset all at once. Can anyone explain why?

        foreach (DataRow dRow in dt1.Rows)
        {
            DataRow dsRow = ds2.Tables["Table"].NewRow();
            dsRow.ItemArray = dRow.ItemArray;
            ds2.Tables["Table"].Rows.Add(dsRow);
        }

        da.Update(ds2,"Table");

        dataGridView1.DataSource = dt1;

        con.Close();
        da.Dispose();
    }

我认为你有打字错误,而且我认为你没有足够仔细地阅读这个问题。如果我将您的代码更正为da.Fill(ds1);我的数据集ds1将填充数据库中当前的空值。这不是我想要的。编辑:显然我错了,用空值填充它。但它仍然不起作用。在添加CSV文件中的值之前,我如何填充数据集?我不需要先获取这些值,然后用这些值填充数据集吗?请参阅下面我使用的代码。谢谢你的回答。有人有更多的见解吗?我仍然无法让它工作。重要的是行需要同时存在原始版本和当前版本,并且rowstate=modified。对行使用HasVersion方法进行检查。使用类似dt.Rows[1][“ColName”,DataRowVersion.Original]的代码查看版本。如果您没有实际填写表格来建立一些“原始”值,然后修改一些值,那么就不会同时拥有这两个版本。您可以添加一行,将rowstate设置为modified,接受更改,然后再次将rowstate设置为modified,但我还没有尝试过。