C#SqlDataAdaptor更新不更新数据库

时间:2012-07-16 15:51:34

标签: c#

我的大脑中有一项相对简单的任务,但它比预期的要困难得多,因为我无法让它发挥作用。我正在使用C#,尝试将数据从csv文件解析为DataTable,然后我想将其插入到SQL数据库中。我想这样做,以便将来可以使用数据库文件(我希望它比CSV文件更快更容易,但请告诉我这是不是很糟糕的假设)。

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

但是,当我从SqlDataAdaptor调用“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,但我遇到的所有解决方案我都不明白或者它们不起作用。谢谢你的时间。

编辑:我已经改变了一些代码,所以我没有在命令构建器之后重新声明数据适配器。但是,它仍然没有更新数据库,虽然代码运行时没有抛出任何东西,最后弹出消息框,然后是我的表单,其中包含来自dt1的数据。

为了澄清,我没有从数据库中获取数据。我试图从CSV文件中获取数据并将其移动到数据库。感谢你目前的帮助。还有其他建议吗?

编辑2:DataTable“dt1”的结构如下:

标题:数字Col1 Col2 Col3 Col4 Col5

DataTypes:int32 Str Str Str Str Str

有25行。

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

标题:数字Col1 Col2 Col3 Col4 Col5

DataTypes:int nvarchar(50) - >

还没有行/数据。

编辑3:Heyooo !!搞定了。这基本上是这里建议的一个混合,所以谢谢大家!

3 个答案:

答案 0 :(得分:1)

我认为你最好通过使用公共代码创建DataTable来填充你的数据集,然后添加csv文件中的值,这样他就可以根据他的第一个状态检测到新的,然后在这种情况下更新会起作用。 希望有所帮助

答案 1 :(得分:0)

首先需要使用SqlDataAdapter填充DataSet,然后调用update method

e.g. ds1.Fill(da); 

答案 2 :(得分:0)

所以这里的代码终于奏效了。现在数据有~24000行(只是为了测试),它会相应地更新DB(编译/运行大约需要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();
    }