如果我创建
SqlDataAdapter adapterSales = new SqlDataAdapter (mySelectCommand, connString)
然后我为适配器创建插入命令,让我们说
adapterSales.InsertCommand = new SqlCommand (myInsertCommand);
为什么我需要将另一个连接传递给最后一个构造函数?我的意思是,如果我已经传递了连接字符串,为什么适配器无法使用它来创建我将要使用的sql连接?
答案 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命令对象,与连接相关联,因此每次需要有关命令对象的信息才能执行操作。