0

我已经搜索了几天,我发现在 C# 代码中建立的 sql 连接有很多可能性,但是我找不到像我这样使用 web.config 和 .aspx 页面建立连接的任何东西。

问题:我的 SQLdatasource1 带有使用存储过程的插入。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.xml 中尝试了以下两个位。

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());
4

3 回答 3

1

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

标记的答案说您可以添加一个“Return_Value”参数来保存该值。

于 2013-05-06T17:39:48.607 回答
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 中的选定值。在您的存储过程中,您需要使用“RETURN @ID”,而不是 Select @ID
  2. ASP 参数应如下所示(确保 Size 不是默认值 0):

    <asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" Type="Int32" Size="100" />
    

或者,您可以使用输出 SQL 参数:

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

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

@ID VARCHAR(20) OUTPUT

在代码部分:

SET @ID = SCOPE_IDENTITY()
于 2017-03-14T16:39:47.950 回答
0

我回到这里留下一个答案,因为我讨厌松散的结局。不幸的是,我永远无法让它按照我开始的方式工作——在 aspx 文件技术中使用 sqldatasource 和模板。我尝试了我能找到的所有东西,但其他人没有做任何事情,很可能是因为我对这个主题的无知我错过了一些东西。

我终于不得不回到开头,在代码隐藏中做所有事情。所以下面是整件事减去我正在使用的 40 个其他参数。对于其他新手或只是兼职 ASP.NET C# 涉猎者,请注意您必须将数据、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.");
    }
于 2013-05-10T12:57:01.880 回答