我已经搜索了几天了,我发现在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());
答案 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);
}
有些事情被忽略了:
ASP参数应如下所示(确保大小不是默认值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()
答案 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.");
}