CommandText= "select @userName=AuthorName from Authorwhere AuthorID=100521136;";注意SQL语句中可以后输出型参数
还有注意,如果DataAdapter中的Command的CommandText="select * from Authorwhere AuthorID=1005211360;",并且Author表中没有AuthorID=’100521136’对应的列,则DataAdapter对DataSet填充后,DataSet中的表数为1,行数为1,不过内容为空,这一点要切记
SQL中的Bit型数据,在C#中对应的是True(1),False(0),Null(Null),在使用时,一定要弄清楚,注:Null(Null)这种情况没有测试
通过DataAdpter对象实现对数据源(数据库)中的数据的删除操作,例子:
其中,datA表示DataAdpter对象,ds表示的是DataSet对象,datT表示的DataTable对象。
第一步:定义DeleteCommand命令行,在执行Update函数时,默认执行的删除命令是DeleteCommand命令
datA.DeleteCommand = new SqlCommand("delete from LinkMan where userName=@userName",conn);
[第二步:如果命令行中有参数,就添加参数]
SqlParameterpara = new SqlParameter("@userName",SqlDbType.NVarChar,15, "userName");
datA.DeleteCommand.Parameters.Add(para);
[第三步:往DataSet中填充数据]
datA.Fill(ds);
[第四步:获取表]
datT = ds.Tables[0];
第五步:执行删除操作,注意只能用Delete函数,不能用Remove或RemoveAt函数
datT.Rows[0].Delete();
第六步:执行回发操作
datA.Update(datT);
在这六步中,第一、五、六步是必须的,而且在执行删除操作后不能让DataTable调用AcceptChanges函数,这个必须记住,因为如果调用AcceptChanges函数,则在DataTable被标记的列,会从DataTable中删除,这样就导致DataAdapter执行Update函数,会误认为没有可删除的行。对于必须采用Delete函数,而不能用Remove或RemoveAt函数,原因也是如此,因为Remove和RemoveAt函数是从DataTable中直接删除数据,而不是标识数据行。
对于更新、插入操作,同删除操作类似,不过对于更新操作指定命令行时,需要注意。MSDN:请注意,在 UPDATE语句的 WHERE 子句中指定的参数设置为使用 SourceColumn 的 Original 值。 这一点很重要,因为 Current 值可能已被修改,可能会不匹配数据源中的值。 Original 值是用于从数据源填充 DataTable 的值。例子:
dataAdpater.UpdateCommand= new SqlCommand(
"UPDATE Categories SETCategoryName = @CategoryName " +
"WHERE CategoryID =@CategoryID", connection);
dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryName",SqlDbType.NVarChar, 15, "CategoryName");
SqlParameterparameter = dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryID",SqlDbType.Int);
parameter.SourceColumn ="CategoryID";
// 这一步对于更新操作是必须的,因为原始数据已经被修改了
parameter.SourceVersion = DataRowVersion.Original;
还有如果DataAdapter对象操作的表只是一个表时,可以通过定义对象SqlCommandBuilder来生成默认的删除、插入、更新命令行。
例子:SqlCommandBuilder cmdBuilder = newSqlCommandBuilder(datA);
这样就生成了默认的命令行。