我有以下代码尝试将两个不同的参数绑定到存储过程:
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
谢谢!
答案 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的另一个受害者