从两个不同的文本框ASP.NET C#将两个数据插入同一列

时间:2017-01-30 12:48:42

标签: c# asp.net sql-server stored-procedures

我尝试将两个数据从两个不同的文本框插入到同一列中。例如,一个人有两个电话号码。在这种情况下,人和电话号码是两个单独的表,电话号码表只有一列来存储电话号码。 我尝试使用存储过程插入数据。 这是存储过程代码。

ALTER Procedure [dbo].[Ph]
@name varchar(200),
@phonenumber varchar(200)

AS
Begin

Declare @P_ID int 

insert into person(Name)
values (@name)

SELECT P_ID = SCOPE_IDENTITY()

insert into phonenumber(PhoneNumber, P_ID)
values (@phonenumber, @P_ID)

RETURN
END

但是,当我尝试插入数据时,会出现一条错误消息,引用“过程或函数Ph指定了太多参数。”。这是用于插入数据的C#代码。

using (SqlConnection con = new SqlConnection("Data Source=YAMADA;Initial Catalog=testtest;Integrated Security=True"))
        {
            using (SqlCommand cmd = new SqlCommand("Ph", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = TextBox1.Text;
                cmd.Parameters.Add("@phonenumber", SqlDbType.Int).Value = TextBox2.Text;
                cmd.Parameters.Add("@phonenumber", SqlDbType.Int).Value = TextBox3.Text;

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

有人可以帮我修复此错误吗? 提前谢谢。

4 个答案:

答案 0 :(得分:1)

该过程只接受两个,但您已添加三个,删除最后一个参数。还有一件事需要注意,第二个参数应该是varchar类型,但是你将它们指定为整数。请改变它们。最后代码将是

using (SqlCommand cmd = new SqlCommand("Ph", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = TextBox1.Text;
            cmd.Parameters.Add("@phonenumber", SqlDbType.VarChar).Value = TextBox2.Text;

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

答案 1 :(得分:1)

修改程序以接受2个电话号码,然后逐个插入:

ALTER Procedure [dbo].[Ph]
    @name varchar(200),
    @phonenumber varchar(200),
    @phonenumber2 varchar(200)
AS
Begin

    Declare @P_ID int 

    insert into person(Name)
    values (@name)

    SELECT @P_ID = SCOPE_IDENTITY()

    insert into phonenumber(PhoneNumber, P_ID)
    values (@phonenumber, @P_ID)

    insert into phonenumber(PhoneNumber, P_ID)
    values (@phonenumber2, @P_ID)
END

然后在调用程序时添加两个电话号码:

using (SqlConnection con = new SqlConnection("Data Source=YAMADA;Initial Catalog=testtest;Integrated Security=True"))
{
    using (SqlCommand cmd = new SqlCommand("Ph", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = TextBox1.Text;
        cmd.Parameters.Add("@phonenumber", SqlDbType.VarChar).Value = TextBox2.Text;
        cmd.Parameters.Add("@phonenumber2", SqlDbType.VarChar).Value = TextBox3.Text;

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

答案 2 :(得分:0)

首先:您只能将每个参数添加一次到命令。

作为解决方案,您有三种选择:

  1. 数据库中第二个数据表的干净approch。 例如:用户ID,电话号码,电话号码 userid是您的usertable的外键。 phoneid与userid结合使用新表的主键。最后但并非最不重要的是,phonenumber是您的用户号码之一。像这样你可以添加任意数量的电话号码。

  2. 我眼中的一个肮脏的approch:将您的电话号码的列类型更改为nvarchar,并将电话号码添加为逗号分隔值。

  3. 添加更多的phonenumber列。例如。 Phonenumber1,Phonenumber2 ...... 但是这个approch也不是一个理想的,因为当你想要添加更多的数字时,Theresa仍然是一个问题...

  4. 最后但并非最不重要:int不是columntype的好选择。 你想用+49 177 77777777做什么。

答案 3 :(得分:-2)

试试这个:

using (SqlConnection con = new SqlConnection("Data Source=YAMADA;Initial Catalog=testtest;Integrated Security=True"))
{
    using (SqlCommand cmd = new SqlCommand("Ph", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = TextBox1.Text;
        cmd.Parameters.Add("@phonenumber", SqlDbType.Int).Value = TextBox2.Text + TextBox3.Text;

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