SqlConnection con = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=.\sqlexpress");
SqlDataAdapter adp = new SqlDataAdapter("select customerid,companyname from customers", con);
adp.MissingSchemaAction = MissingSchemaAction.AddWithKey;
SqlCommandBuilder cmbuild = new SqlCommandBuilder(adp);
DataSet ds = new DataSet();
adp.Fill(ds, "test");
Console.WriteLine("跟新前...");
foreach (DataRow dr in ds.Tables["test"].Rows)
{
Console.WriteLine(dr["customerid"] + "\t" + dr["companyname"]);
}
ds.Tables["test"].Rows[0]["companyname"] = "九州通";
adp.Update(ds.Tables["test"]);
//ds.AcceptChanges();
Console.WriteLine("跟新后...");
foreach (DataRow dr in ds.Tables["test"].Rows)
{
Console.WriteLine(dr["customerid"] + "\t" + dr["companyname"]);
}
//添加新行
//DataRow drr = ds.Tables["test"].NewRow();
//drr[0] = "chenc";
//drr[1] = "cc1388";
//ds.Tables["test"].Rows.Add(drr);
//删除行
//添加主键
//DataColumn[] dc = new DataColumn[1];
//dc[0] = ds.Tables["test"].Columns[0];
//ds.Tables["test"].PrimaryKey = dc;
DataRow drrr = ds.Tables["test"].Rows.Find("chenc");
drrr.Delete();
adp.Update(ds.Tables["test"]);
/////////////////////////////
DataRow[] drrrs = ds.Tables["test"].Select();
//创建外键,一对多的关系,父表和子表
DataRelation relation=ds.Relations.Add("customerOrders", ds.Tables["coustomers"].Columns["customerId"], ds.Tables["orders"].Columns["customerId"]);
//得到父表中的行
DataRow pdr = ds.Tables["coustomers"].Rows.Find("ALFKI");
//得到子表行
DataRow[] cdr= pdr.GetChildRows(relation);
Console.ReadKey();
////////////////////////////////////////////////////////////////////////////////////////////////
对于数据库的操作,资料太多,大家也比较熟悉。
但有时数据量较少,但更新频繁的变量操作,通常采用自定义结构,但自定义结构的可维护性和灵活性就比不上临时表,我们可以先用DataTable做为内存临时表,以数据库操作的方式灵活添加列、行,完成 主键设置、查询、更新等操作,还可以保存为xml文件。
假设在当前类作用域有全局对象
我们在某个测试函数中添加下面的测试代码:
为了方便存储为xml文件,需要设置表名:
为临时表添加表结构,既列名:
dtRefresh.Columns.Add("频率", typeof(int));
dtRefresh.Columns.Add("自动关闭延迟", typeof(int));
dtRefresh.Columns.Add("Url", typeof(string));
设置其中一个列Url为主键:
clos[0] = dtRefresh.Columns["Url"];
dtRefresh.PrimaryKey = clos;
为表添加一行测试记录:
注意:添加行时,应先声明行,在需要用时再赋予对象实体,这样的目的是为了突出每次添加新行时,只需赋予一个dtRefresh.NewRow()返回的对象即可,而不用重新声明一个行对象名。因为类操作是传引用,如果一个行对象名赋予一个表,再修改这个对象名的内容,表中内容会跟着修改,所以每次添加行时要重用行名但避免重用对象。
dr = dtRefresh.NewRow();
dr["数量"] = 100;
dr["频率"] = 100;
dr["自动关闭延迟"] = 100;
dr["Url"] = "http://www.baidu.com/";
dtRefresh.Rows.Add(dr);
执行查询:
foreach (var item in drArr)
{
txb.Text += item["Url"].ToString() + Environment.NewLine;
}
根据查询条件,更新记录:
drArr[0]["Url"] = "g.cn";
foreach (var item in drArr)
{
txb.Text += item["Url"].ToString() + Environment.NewLine;
}
写入XML文件: