ASP.NET sqldatasource在代码隐藏中无法访问ReturnValue

时间:2013-05-06 15:01:41

标签: c# asp.net return-value

我已经搜索了几天了,我发现在C#代码中进行sql连接有很多可能,但我找不到任何使用web.config和.aspx页面建立连接的地方矿。

问题:我的SQLdatasource1带有使用存储过程的Insert。 SP检查重复ID(MRN),如果找到一个,则返回0,如果没有,则吐出1。只要没有重复,它也会执行插入。一切都很好。

但是,我想抓住ReturnValue,检查0或1,并根据结果给用户一条消息。这是我正在使用的。它简化为简略。表单是一个带有InsertItemTemplate的asp:formview,其中包含所有控件。

<asp:sqldatasource ID="sqldatasource1" runat="server"
ConnectionString="<%$ ConnectionStrings:... %>"
ProviderName="..."
...
<InsertParameters>
     <asp:Parameter Name="return_value" DefaultValue="0" Type="Empty" Size="0" ConvertEmptyStringToNull="False" Direction="ReturnValue" />
</InsertParameters>

在代码隐藏中,我只想获取参数return_value的值并对其进行响应。我下面的内容是我想做的,但显然是错的。我只是想发布它,因为我想象它,所以你知道我的意图。我已经尝试使用按钮的单击,这不仅给了我相同的错误,即当前上下文中不存在return_value,但它也不会发布消息框。我已经尝试了很多不同的东西,我迷失了。

更新:这就是我目前在代码隐藏中所拥有的。当弹出窗口时,MessageBox只显示“@return_value”。

        protected void Sqldatasource1_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
    SqlParameter return_value = new SqlParameter("@return_value", SqlDbType.Int);
    return_value.Direction = ParameterDirection.ReturnValue;
    return_value.Value = (object)return_value ?? DBNull.Value;
    MessageBox.Show(return_value.Value.ToString());

    if (Convert.ToInt32(return_value.Value) != 1)
    {
        MessageBox.Show(return_value.Value.ToString());
    }
    else
    {
        MessageBox.Show(return_value.Value.ToString());

    }
}  

提前致谢。对不起,如果这是可笑的初级,但我是盲目的。

更新2(2013年5月7日):经过额外的搜索和阅读后,我尝试了其他一些无效的方法。没有错误,只是不起作用。我在Inserted中尝试了以下两位。

int? return_value = e.Command.Parameters["@return_value"].Value as int?;
    MessageBox.Show(return_value.ToString());

int return_value = (Convert.ToInt32(e.Command.Parameters["@return_value"]));
    MessageBox.Show(return_value.ToString());

3 个答案:

答案 0 :(得分:1)

您是否尝试在插入时添加参数?查看此链接:http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/7d37ac80-af6d-46ad-8ae0-dc7891596aac

标记的答案表示您可以添加&#34; Return_Value&#34;保存值的参数。

答案 1 :(得分:1)

对于长时间的延迟感到抱歉,认为记录这个是有用的,因为我遇到了同样的问题而且无法在互联网上找到任何答案。

要从SQL Server检索返回值,您需要从Inserted事件中访问它。

 protected void DSProjects_Inserted(object sender, SqlDataSourceStatusEventArgs e)
        {
            string strID = (e.Command.Parameters["@RETURN_VALUE"].Value).ToString();


            Response.Redirect("ProjectDetails.aspx?id=" + strID);
        }

有些事情被忽略了:

  1. 返回值不是SQL中的选定值。在您的存储过程中,您需要使用&#34; RETURN @ ID&#34;而不是选择@ID
  2. ASP参数应如下所示(确保大小不是默认值0):

    <asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" Type="Int32" Size="100" />
    
  3. 或者,您可以使用输出SQL参数:

    <asp:Parameter Direction="Output" Name="ID" Type="Int32" Size="100" />
    

    并使用输出设置SQL。在范围:

    @ID VARCHAR(20) OUTPUT
    
    代码部分中的

    SET @ID = SCOPE_IDENTITY()
    

答案 2 :(得分:0)

我回到这里留下答案因为我讨厌松散的结局。不幸的是,我从来没有按照我设定的方式使其工作 - 使用aspx文件技术中的sqldatasource和模板。我尝试了所有我能找到的东西,其他任何人都没有为我工作,这很可能是因为我对这个问题一无所知我错过了什么。

我终于不得不回到开头,在代码隐藏中做所有事情。所以下面是整个事情减去我正在使用的其他40个参数。对于其他新的或仅兼职的ASP.NET C#dabblers,请注意您必须将数据data.sqlclient和windows.forms添加到您的代码隐藏中。您还需要添加Windows窗体参考(网站菜单/添加参考)。但请注意,您几乎不想将Windows.Forms用于警报。这是一个特例。以下内容最适合测试,但要发布供其他人使用,您需要使用Javascript或其他技术进行警报。

祝你好运,我希望这有助于某人。

using System.Data;  
using System.Data.SqlClient;
using System.Windows.Forms;

...

    protected void Save_Click(object sender, EventArgs e)
{

    string connectionstring = WebConfigurationManager.ConnectionStrings["MyDB01"].ConnectionString;
    SqlConnection con = new SqlConnection();
    con.ConnectionString = connectionstring;
    SqlCommand cmd = new SqlCommand();

    cmd = new SqlCommand("DS_SSRS_Reports.dbo.DRPinsertPat", con);


    cmd.Parameters.AddWithValue("@NPI", NPI.Text);
    ...
    cmd.Parameters.Add(new SqlParameter("@return_value", SqlDbType.Int));
    cmd.Parameters["@return_value"].Direction = ParameterDirection.ReturnValue;

    cmd.CommandType = CommandType.StoredProcedure;

    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

    int r = (Convert.ToInt32(cmd.Parameters["@return_value"].Value));

    if (r.Equals(0))
    {
        MessageBox.Show("MRN already exists in DRP database. Patient not entered.");
    }
    else
    {
        MessageBox.Show("Patient successfully added.");
    }