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