将参数绑定到存储过程

时间:2015-01-16 08:43:18

标签: sql-server vb.net stored-procedures parameters parameter-passing

我有以下代码尝试将两个不同的参数绑定到存储过程:

Dim ddlmanager As DropDownList = e.Row.FindControl("ddlManager")

            'ddlmanager.Items.Remove(ddlmanager.Items.FindByText(Name))
            Dim lblLevel As Label = e.Row.FindControl("lblLevel")
            Dim thisLevel = Convert.ToInt32(lblLevel.Text)
            Dim email As String = Profile.email

            Dim strConn As String = ConfigurationManager.ConnectionStrings("RequestManagementConnectionString").ConnectionString
            Dim cn As New Data.SqlClient.SqlConnection(strConn)
            Dim cmd As New Data.SqlClient.SqlCommand("RM_Private.SelectLineManagerOptions", cn)

            cmd.CommandType = Data.CommandType.StoredProcedure
            cmd.Connection = cn
            cmd.Parameters.AddWithValue("@thisLevel", thisLevel)
            cmd.Parameters.AddWithValue("@email", email)

            cn.Open()

            Dim dr As Data.SqlClient.SqlDataReader

            dr = cmd.ExecuteReader()
            ddlmanager.DataSource = dr
            ddlmanager.DataBind()

            cn.Close()

现在,当我在Visual Studio中调试它时,@email被设置为来自profile.email的有效电子邮件地址,另一个参数@thisLevel也是如此。它似乎没有正确发送到存储过程。

有人可以帮忙吗?

感谢。 DS

更新:上面的代码现在成功调用存储过程。 更新:sp成功调用并填充ddl

谢谢!

2 个答案:

答案 0 :(得分:2)

不要使用cmd.ExecuteNonQuery()您需要将数据拉回某些内容,例如SqlDataReader。将DropDown的DataSource设置为读者。

按照建议更改CommandType。然后...

 Dim dr As SqlDataReader

dr = cmd.ExecuteReader()
ddlmanager.DataSource = dr

然后Bind

我不太了解VB.net所以你可能需要稍微修改一下

答案 1 :(得分:1)

如果在项目属性中设置Option Strict On,则可以避免此问题。 SqlCommand.CommandType需要SqlClient.Data.CommandType类型的值。使用Option Strict Off,您可以自由地将SqlCommand的CommandType设置为另一个枚举值,就像使用SqlDataSourceCommandType.StoredProcedure

一样

但是SqlDataSourceCommandType.StoredProcedure的值为(int)1,而正确的枚举CommandType.StoredProcedure的值为(int)4。不一样。

Option Strict Off的另一个受害者