【问题标题】:C# SqlDataAdaptor Update not updating databaseC# SqlDataAdaptor 更新不更新数据库
【发布时间】:2012-07-15 12:17:06
【问题描述】:

我的大脑中有一个相对简单的任务,但它比预期的要困难得多,因为我无法让它发挥作用。我在 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

数据类型:int32 Str Str Str Str Str

有 25 行。

dbTestCsv.mdf文件中的表如下:

标题:数字 Col1 Col2 Col3 Col4 Col5

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

还没有行/数据。

编辑 3:嘿嘿!!得到它的工作。它基本上是这里建议的混合体,所以谢谢大家!

【问题讨论】:

  • 谁有更多的见解?我仍然无法正常工作。

标签: c#


【解决方案1】:

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

【讨论】:

  • 在添加 CSV 文件中的值之前,我将如何填充我的数据集?我不需要先获取值,然后用这些值填充数据集吗?
  • 我使用的有效代码见下文。谢谢你的回答。
【解决方案2】:

您需要先使用 SqlDataAdapter 填充 DataSet,然后调用您的更新方法

e.g. ds1.Fill(da); 

【讨论】:

  • 我认为你有一个错字,我认为你没有仔细阅读这个问题。如果我将您的代码更正为 da.Fill(ds1);我的数据集 ds1 将填充数据库中当前的空值。这不是我想要的。编辑:显然我用空值填充它是错误的。但是还是不行。
【解决方案3】:

所以这是最终有效的代码。数据现在有大约 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();
    }

【讨论】:

  • 重要的似乎是该行需要同时存在原始版本和当前版本,并且 rowstate = 已修改。对一行使用 HasVersion 方法进行检查。使用 dt.Rows[1]["ColName", DataRowVersion.Original] 之类的代码查看版本。如果您实际上并没有填写表格来建立一些“原始”值,然后修改一些值,那么您将不会拥有两个版本。您也许可以添加一行,将 rowstate 设置为 modified,AcceptChanges,然后再次将 rowstate 设置为 modified,但我还没有尝试过。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多