我必须在查询中显示所有行 - 我的错误在哪里?

时间:2017-07-18 10:10:22

标签: c# sql-server

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

1 个答案:

答案 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在插入或更新数据时非常有用 - 而不是在读取数据时。