为什么SqlDataAdapter.InsertCommand需要另一个SqlConnection?

时间:2012-01-20 16:34:47

标签: c# sql c#-4.0 ado.net

如果我创建

SqlDataAdapter adapterSales = new SqlDataAdapter (mySelectCommand, connString) 

然后我为适配器创建插入命令,让我们说

adapterSales.InsertCommand = new SqlCommand (myInsertCommand);

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

3 个答案:

答案 0 :(得分:1)

需要连接的命令对象(选择,插入,更新,删除)。数据适配器本身实际上没有与其直接关联的特定连接。使用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;

因此,从理论上讲,您可以使用与数据适配器关联的每个命令的不同连接,但是对于该场景会有很多用途(可能处理两个只读且更新的数据库)并不明显。被送到另一个)。

答案 1 :(得分:0)

这是SqlCommand构造函数所需的参数,可以从select命令自动创建AFAIR InsertCommand,然后即使定义InsertCommand也不需要此重复。

来自MSDN

  

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

答案 2 :(得分:0)

,因为MSDN声明SqlDataAdapter

  

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

     

当InsertCommand被分配给先前创建的SqlCommand时,   未克隆SqlCommand。 InsertCommand维护对的引用   以前创建的SqlCommand对象。

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

相关问题