早就听说可以用DataSet更新数据库,但一直没机会体验。这几天正好有个类似的题目,测试一下:
string connectionString="";
SqlConnection conn = new SqlConnection(connectionString);
string sql = "select * from SalesOrders";
conn.Open();
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(ds, "sales");
dataGridView1.DataSource = ds.Tables["sales"];
上面的代码完成从数据库读入数据,存入DataSet中,然后显示出来。
把内容改一下,更新到数据库:
//ds.Tables["sales"].Rows[1]["Customer_No"] = "00";
int i = 0;
foreach (DataRow rw in ds.Tables["sales"].Rows)
{
rw["Customer_No"] = "xyzz" + i.ToString();
i++;
}
adapter.Update(ds, "sales");
更改没问题,更新有问题了。执行到adapter.Update()时出错,提示说adapter.UpdateCommand没有提供。又增加两行代码之后,问题解决:
SqlCommandBuilder myComm = new SqlCommandBuilder(adapter);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
但是AddWithKey用Add代替也可以。确实也有提示说需要PrimaryKey,但我加了之后没用。
这是全部代码:
string connectionString="";
SqlConnection conn = new SqlConnection(connectionString);
string sql = "select * from SalesOrders";
conn.Open();
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
SqlCommandBuilder myComm = new SqlCommandBuilder(adapter);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
adapter.Fill(ds, "sales");
//ds.Tables["sales"].Rows[1]["Customer_No"] = "00";
int i = 0;
foreach (DataRow rw in ds.Tables["sales"].Rows)
{
rw["Customer_No"] = "xyzz" + i.ToString();
i++;
}
adapter.Update(ds, "sales");
dataGridView1.DataSource = ds.Tables["sales"];
又试了一下出错,原因是没设Primary key。只好加了一个字段ID(int)
在goDaddy网站里,新加的字段只有not null时才可以设成Primary key;而要想not null必须选择Identify(Id.)。
下面是设置主键的命令:
ALTER TABLE SalesOrders ADD CONSTRAINT pk_SalesOrders PRIMARY KEY (ID)