使用命令构造器添加行
View Code
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属性必须有一个包含主键的查询。