日期:2014-05-17  浏览次数:20878 次

请问SqlParameter.SourceColumn属性,这里怎么解释?
SqlParameter.SourceColumn 属性:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlparameter.sourcecolumn.aspx

请看代码:

string strConn = "server = '(local)';database=Person;integrated security = true";
string strSQL = "SELECT * FROM 雇员表";
SqlConnection conn = new SqlConnection(strConn);
SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
DataTable dt = new DataTable("雇员表");
da.Fill(dt); //填充DataTable 

dt.Rows.Add(new object[]{4,"张芳",25,"重庆"}); //给DataTable 添加一行
string strup = "INSERT 雇员表 VALUES(@雇员_ID,@姓名,@年龄,@住址)";
da.InsertCommand = new SqlCommand(strup,conn);
da.InsertCommand.Parameters.Add("@雇员_ID", SqlDbType.NVarChar, 10, "雇员_ID"); //设置参数
da.InsertCommand.Parameters.Add("@姓名", SqlDbType.NVarChar, 10, "姓名");
da.InsertCommand.Parameters.Add("@年龄", SqlDbType.Int, 10, "年龄");
da.InsertCommand.Parameters.Add("@住址", SqlDbType.NVarChar, 10, "住址");
da.Update(dt); //向数据库提交更新
Console.WriteLine("成功");
Console.ReadKey();



上面创建参数的时候,最后一个参数即是SqlParameter.SourceColumn 属性的值,也就是源列的名称。

问题:

提交更新时,源表插入了新行,请解释一下,在此过程中,SourceColumn属性是怎么把新行的值传递给参数传的,具体过程,谢谢?

------解决方案--------------------
是不是少了da.SelectCommand=SqlCommand

1:使用 InsertCommand 属性
要指定自己的 "插入" 语句,并且应当在针对 DataAdapter 调用 "更新" 方法时执行此语句,请设置 InsertCommand 属性。可对参数化查询或存储过程设置 InsertCommand 属性。可以按照定义 "命令" 对象的参数时使用的方法,定义 InsertCommand 的参数。SQL 托管提供程序允许使用命名参数。

您需要设置所有参数的 SourceColumn 属性。SourceColumn 告诉 DataAdapter 对象,表中的哪一列将提供它的值。将它设置为实际的参数名
2:
在 insert过程中,如果未设置此属性而且 DataSet 中存在主键信息,那么在设置 SelectCommand 属性并使用 SqlCommandBuilder 的情况下,可以自动生成 InsertCommand。然后,SqlCommandBuilder 将生成其他任何未设置的命令。此生成逻辑要求 DataSet 中存在键列信息。有关更多信息,请参见使用 CommandBuilder 生成命令 (ADO.NET)。

在将 InsertCommand 分配给以前创建的 SqlCommand 时,不克隆 SqlCommand。InsertCommand 维护对以前创建的 SqlCommand 对象的引用。

如果执行此命令后返回行,则可以将这些行添加到 DataSet 中,具体取决于如何设置 SqlCommand 对象的 UpdatedRowSource 属性。

对于传给 insert上的数据源的每一列,应向 InsertCommand、UpdateCommand 或 DeleteCommand 添加一个参数。该参数的 SourceColumn 属性将被设置为列的名称。这指示该参数值并非手动设置,而是获取自当前处理的行中的特定列。 

------解决方案--------------------
sourcecolumn是直接针对列的,不针对具体的值
比如你的dt有一行列名叫 Name
那么你的代码应该是类似这样的:

string strup = "INSERT (name) VALUES(@姓名)";
da.InsertCommand = new SqlCommand(strup,conn);
da.InsertCommand.Parameters.Add("@姓名", SqlDbType.NVarChar, 10);
da.InsertCommand.Parameters["@姓名"].SourceColumn="Name"; 
da.Update(dt); //向数据库提交更新
da.AcceptChanges();
。。。。。


------解决方案--------------------
SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
DataTable dt = new DataTable("雇员表");
da.Fill(dt); //填充DataTable
上面三行即是查询结果并填充至dt,dt.Columns自此确定了(与你数据库中的一样)

dt.Rows.Add(new object[]{4,"张芳",25,"重庆"}); //给DataTable 添加一行
dt中的第一行都有个状态,DataRowState,此时新行为Added
当da.Update(dt)时,da便会从dt中所有行状态为Added的行中,依据参数的SqlParameter.SourceColumn属性提取相应列的值,最后更新至数据库中
------解决方案--------------------
dt中的第一行 -> dt中的每一行
------解决方案--------------------
探讨

引用:

SqlDataAdapter da = new SqlDataAdapter(strSQL, conn);
DataTable dt = new DataTable("雇员表");
da.Fill(dt); //填充DataTable
上面三行即是查询结果并填充至dt,dt.Columns自此确定了(与你数据库中的一样)

dt.Rows.Add(new……