使用命令构造器添加行
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PersistAddsBuilder {class Program{static void Main(string[] args){string connString = @"server=.;integrated security=true;database =northwind";string qry = @"select * from employees where country='UK'";SqlConnection conn = new SqlConnection(connString);try{SqlDataAdapter da = new SqlDataAdapter();da.SelectCommand = new SqlCommand(qry, conn);SqlCommandBuilder cb = new SqlCommandBuilder(da);DataSet ds = new DataSet();da.Fill(ds, "employees");DataTable dt = ds.Tables["employees"];DataRow newRow = dt.NewRow();newRow["firstname"] = "Roy";newRow["lastname"] = "Beatty";newRow["titleofcourtesy"] = "Sir";newRow["city"] = "Birmingham";newRow["country"] = "UK";dt.Rows.Add(newRow);foreach (DataRow row in dt.Rows){Console.WriteLine("{0} {1} {2}", row["firstname"].ToString().PadRight(15), row["lastname"].ToString().PadLeft(25), row["city"]);}da.Update(ds, "employees");}catch (Exception e){Console.WriteLine("Error: " + e);}finally{conn.Close();}Console.ReadKey();}} }
示例说明
最值得注意的地方并不是添加的一行代码,而是该代码所替代的代码,下面的一行语句:
使下面的所有代码变得多余:
string ins = @"insert into employees(firstname,lastname,titleofcourtesy,city,country)
values(@firstname,@lastname,@titleofcourtesy,@city,@country)";
SqlCommand cmd = new SqlCommand(ins, conn);
cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10, "firstname");
cmd.Parameters.Add("@lastname", SqlDbType.NVarChar, 20, "lastname");
cmd.Parameters.Add("@titleofcourtesy", SqlDbType.NVarChar, 25, "titleofcourtesy");
cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city");
cmd.Parameters.Add("@country", SqlDbType.NVarChar, 15, "country");
da.InsertCommand = cmd;
显然,使用命令构建器比手动编写SQL更好,但是它们只能处理一个表,底层的数据库表必须有主键或唯一键。另外,数据适配器的SelectCommand属性必须有一个包含主键的查询。