public Section SectionView(object id, SqlConnection conn)
{
using (SqlCommand cmd = new SqlCommand())
{
if (conn.State == ConnectionState.Closed)
conn.Open();
SqlDataAdapter sqlda = new SqlDataAdapter("TMR_SECTION_VIEW", conn);
SqlDataAdapter da = new SqlDataAdapter("data", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "TMR_SECTION_VIEW";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@sectionID", id.ToString);
cmd.Parameters.AddWithValue("@name", name);
da.SelectCommand = cmd;
DataTable dt = new DataTable();
DataTable dtbl = new DataTable();
sqlda.Fill(dtbl);
cmd.ExecuteNonQuery();
return id;
}
}
我的存储过程是:
ALTER PROCEDURE [dbo].[TMR_SECTION_VIEW]
@sectionID int, @name varchar(100)
AS
BEGIN
SELECT *
FROM Section
WHERE sectionid = @sectionID
END
答案 0 :(得分:1)
你的东西有点乱了......
您应该在SqlCommand(而不是DataAdapter)上指定命令名称,并且您应该告诉DataAdapter使用SqlCommand。
我改变这个以允许您在调用函数时将存储过程名称指定为参数:
public Section SectionView(object id, SqlConnection conn, string sql = String.Empty)
{
if (!String.IsNullOrEmpty(sql))
{
if (conn.State == ConnectionState.Closed) conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@sectionID", id.ToString);
cmd.Parameters.AddWithValue("@name", name);
SqlDataAdapter da = new SqlDataAdapter
{ SelectCommand = cmd };
DataTable dtbl = new DataTable();
sqlda.Fill(dtbl);
return id;
}
}
}
你复制了很多东西(比如设置你的SqlCommand的CommandType)并且你创建了DataTable dt
而没有使用它,所以我在答案中将它从样本中删除了。
所以这里发生的是你将sql字符串指定为参数(可以是普通的SQL查询或存储过程)并且你正在构建{{1}与它有参数。
使用该SqlCommand,您可以创建一个将SqlCommand作为SelectCommand的DataAdapter,然后您使用该DataAdapter来填充DataTable。
注意:您在检索数据时不需要执行SqlCommand
,因为SqlCommand.ExecuteNonQuery()
功能基本上是为您执行此操作。
ExecuteNonQuery在插入或更新数据时非常有用 - 而不是在读取数据时。