SqlDataAdapter.InsertCommand需要另一个SqlConnection的原因

本文关键字:SqlConnection 另一个 InsertCommand SqlDataAdapter | 更新日期: 2023-09-27 18:20:51

如果我创建

SqlDataAdapter adapterSales = new SqlDataAdapter (mySelectCommand, connString) 

然后我为适配器创建插入命令,比如

adapterSales.InsertCommand = new SqlCommand (myInsertCommand);

为什么我需要将另一个连接传递给最后一个构造函数?我的意思是,如果我已经传递了连接字符串,为什么适配器不使用它来创建我将要使用的sql连接?

SqlDataAdapter.InsertCommand需要另一个SqlConnection的原因

需要连接的是命令对象(选择、插入、更新、删除)。数据适配器本身实际上没有直接关联的特定连接。使用Reflector,我看到以下是SqlDataAdapter的成员(其中没有直接的连接对象):

// Fields
private SqlCommandSet _commandSet;
private SqlCommand _deleteCommand;
private SqlCommand _insertCommand;
private SqlCommand _selectCommand;
private int _updateBatchSize;
private SqlCommand _updateCommand;
private static readonly object EventRowUpdated;
private static readonly object EventRowUpdating;

因此,理论上,您可以对与数据适配器关联的每个命令使用不同的连接,但这种情况的用途并不明显(可能处理两个数据库,其中一个是只读的,更新被发送到另一个)。

这是SqlCommand构造函数所需的参数,AFAIR InsertCommand可以通过select命令自动创建,那么即使定义InsertCommand也不需要这种重复。

来自MSDN

如果数据集中存在主键信息,则InsertCommand如果设置SelectCommand属性,则可以自动生成并使用SqlCommandBuilder。

MSDN称之为SqlDataAdapter

如果设置SelectCommand属性并使用SqlCommandBuilder,则可以自动生成InsertCommand。

将InsertCommand分配给以前创建的SqlCommand时SqlCommand未克隆。InsertCommand维护对以前创建的SqlCommand对象。

Ecah命令对象,与连接关联,因此每次它都需要有关命令对象的信息来执行操作。