C#中的StoredProcedure,从文本框传递参数

时间:2013-08-20 04:25:44

标签: c# asp.net sql-server

我有一个非常简单的页面,想知道如何将文本框中的数据传递到我的程序中。我将新的参数从后面的代码传递到DB,我有一个新的代码页面是

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:TextBox ID="LastName" runat="server"></asp:TextBox>
        <asp:TextBox ID="FirstName" runat="server"></asp:TextBox>
        <asp:TextBox ID="Phone1" runat="server"></asp:TextBox>
        <asp:TextBox ID="Phone2" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        <br />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TicketsConnectionString %>" SelectCommand="SELECT * FROM [Employee]"></asp:SqlDataSource>

    </div>
    </form>
</body>
</html>

和aspx代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public partial class _Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    string connectionString = ConfigurationManager.ConnectionStrings["TicketsConnectionString"].ConnectionString;

    protected void Button1_Click(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand("InsertIntoEmployee", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = LastName.Text;
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar);
    cmd.Parameters.Add("@Phone1", SqlDbType.VarChar);
    cmd.Parameters.Add("@Phone2", SqlDbType.VarChar);
    cmd.Parameters["@LastName"].Value = LastName.Text;
    cmd.Parameters["@FirstName"].Value = FirstName.Text;
    cmd.Parameters["@Phone1"].Value = Phone1.Text;
    cmd.Parameters["@Phone2"].Value = Phone2.Text;
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
    }
}

web.config看起来像这样

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <connectionStrings>
    <add name="TicketsConnectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=&quot;C:\Users\Asya\Documents\Visual Studio 2012\WebSites\WebSite6\App_Code\Tickets.mdf&quot;;Integrated Security=True;Connect Timeout=30"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
</configuration>

当我将简单数据传递给我的prosedure时,它会抛出错误

An SqlParameter with ParameterName '@LastName' is not contained by this SqlParameterCollection.

如何解决此问题?因为在DB端程序工作完美  在我开始学习之前,我真的很喜欢它。我修复了以前的问题,但在这里另一个

The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.FormatException: The string was not recognized as a valid DateTime. There is an unknown word starting at index 0.

Source Error: 


Line 34:         cmd.Parameters["@Phone2"].Value = Phone2.Text;
Line 35:         con.Open();
Line 36:         cmd.ExecuteNonQuery();
Line 37:         con.Close();
Line 38: 

我使用的程序

procedure InsertIntoEmployee
@LastName Nvarchar (25) ,
@FirstName Nvarchar (25) , 
@Phone1 Nvarchar (25) ,
@Phone2 Nvarchar (25)
as 
insert into  Employee  (LastName , FirstName,Phone1,Phone2)values (@LastName,@FirstName,@Phone1,@Phone2);

当我在Db侧运行prosedure时 EXEC InsertIntoEmployee N'петров', N'петр', 99999999,null 它运行完美,但从asp.net方面抛出错误

4 个答案:

答案 0 :(得分:3)

如果我错了,请纠正我,但似乎这一行

cmd.Parameters.Add("@LastName ", SqlDbType.Date);

LastName 之后有一个额外的空格。应该是

cmd.Parameters.Add("@LastName", SqlDbType.Date);

相反?

答案 1 :(得分:2)

您需要从“@LastName”

中删除空格

这样的东西
cmd.Parameters.Add("@LastName", SqlDbType.Date);

但是这只会将错误转移到嵌套行,因为@FirstName也不在参数列表中。

事实上,在你有正确的@LastName

之后

所有这3行都会引起问题

cmd.Parameters["@FirstName"].Value = FirstName.Text;
cmd.Parameters["@Phone1"].Value = Phone1.Text;
cmd.Parameters["@Phone2"].Value = Phone2.Text

答案 2 :(得分:2)

当然,关于空间的其他答案是正确的。请注意,如果您立即分配参数值,可以避免此类问题(或者至少让它们一直错误;-),如下所示:

cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = LastName.Text;

此外,您使用SqlDbType.Date作为@LastName参数。除非你有一个非常奇怪的架构,否则很可能是错误的。因此,我使用了上面的SqlDbType.VarChar

答案 3 :(得分:1)

试试这个

protected void Button1_Click(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand("InsertIntoEmployee", con);
        cmd.CommandType = CommandType.StoredProcedure;            
        cmd.Parameters.Add("@LastName", SqlDbType.NVarChar(MAX)).Value = LastName.Text;
         cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar(MAX)).Value = FirstName.Text;
          cmd.Parameters.Add("@Phone1", SqlDbType.NVarChar(MAX)).Value = Phone1.Text;
         cmd.Parameters.Add("@Phone2", SqlDbType.NVarChar(MAX)).Value = Phone2.Text;
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();

      //  gvQuarterlyReport.DataBind();
    }