UpdateRowSource是DbCommand的一个属性,当DbCommand把本地变化更新到数据库的时候,UpdateRowSource可能把数据库的变化带回本地。
用例子来说:
假设有一个数据库叫做My,我们定义一个表叫做MyTable:
use MyTest;
create table MyTable
(
id int identity(1,1) primary key,
name nvarchar(32)
);
因为id是自增项,插入的时候必须留空,因此插入的时候只传‘name’,不可以传本地定义的id。id只能插入后用SCOPE_IDENTITY()获得。这里,UpdateRowSource就可以用来把数据库的变化,比如id,更新到本地中来。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp7
{
class Program
{
static void Main(string[] args)
{
string connStr = "server=.;database=mytest;uid=sa;pwd=Server2012";
using (SqlConnection con = new SqlConnection(connStr))
{
using (var sda = new SqlDataAdapter("select * from mytable", con))
{
DataTable table = new DataTable();
sda.Fill(table);
sda.InsertCommand = new SqlCommand("insert into mytable(name) values(@name);select SCOPE_IDENTITY() as id", con);
sda.InsertCommand.Parameters.Add("@name", SqlDbType.NVarChar, 100, "name");
sda.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
table.Rows.Add(0, "extra person");
sda.Update(table);
foreach(DataRow row in table.Rows)
{
Console.WriteLine(row[0] + "\t" + row[1]);
}
Console.Read();
}
}
}
}
}
其中select SCOPE_IDENTITY() as id返回了一个记录,而UpdateRowSource.FirstReturnedRecord把该纪录写回了本地的table。你可以看到[2, 'extra person']。
相形之下,如果改成sda.InsertCommand.UpdatedRowSource = System.Data.UpdateRowSource.None;
那么,table中的第二条记录就不会得到更新,还是[0, 'extra person']