【问题标题】:Insert two data into same column from two different textbox ASP.NET C#从两个不同的文本框 ASP.NET C# 将两个数据插入同一列
【发布时间】:2017-01-30 12:48:42
【问题描述】:

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

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

但是,当我尝试插入数据时,会出现一条错误消息,引用“Procedure or function Ph has too many arguments specified.”。这是插入数据的 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();
            }
        }

有人可以帮我解决这个错误吗? 提前致谢。

【问题讨论】:

  • 您提供的参数比需要的多。
  • 如果您需要两个电话号码作为过程的输入,则为这些号码定义 2 个过程参数...ALTER Procedure [dbo].[Ph] @name varchar (200), @phonenumber varchar(200), @phonenumber2 varchar(200)
  • 那么如何将其存储在同一列下? @user1429080

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


【解决方案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】:

    该过程只接受两个,但您添加了三个,删除最后一个参数。您还需要注意的另一件事是,第二个参数的类型应该是 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();
            }
    

    【讨论】:

    • 如何从另一个文本框中存储来存储另一个同名电话号码?
    • 您可能需要考虑添加一个主表作为名称,然后添加一个子表(第二个表),它引用回用户(我建议给每个用户一个数值)和您可以存储任意数量的电话号码。如果您只需要两个电话号码,那么我将在主数据库中只有两个字段。在这种情况下,它更多的是关于数据库和表结构而不是代码。 (例如@wudge 解决方案将两者放在一个字段中)然后您必须考虑数据以及稍后如何提取/显示数据。 (笔和纸时间!)
    • 您将如何在程序中使用第二个电话号码?无论如何,如果您想为存储过程获取另一个值意味着您必须首先在 SP 中指定它们,然后在命令中添加该参数
    【解决方案3】:

    首先:每个参数只能在命令中添加一次。

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

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

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

    3. 添加更多电话号码列。例如。电话号码1,电话号码2... 但是这种方法也不是可取的,因为当您想添加更多数字时,Theresa 仍然是一个问题......

    最后但并非最不重要的一点:int 不是作为列类型的好选择。 你想用 +49 177 77777777 之类的号码做什么。

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

      • 如何从另一个文本框存储到另一个同名电话号码?
      • 查看过程phonenumber varchar(200),这意味着参数应该是varchar,但您已将它们指定为整数。我也更正了它们,但仍然投了反对票,并且您因错误的建议而获得了 +1 的恩赐
      • 我的意思是我想将两个电话号码存储在同一列中。
      • 这两个电话号码之间需要一个分隔符。空间什么的。否则你最终会得到 888-777-6666555-444-3333。此外,如果数据库列对其值大小有限制(例如,美国 10 位数字),那么如果没有帮助表将电话号码与帐户相关联(或更改列,这可能是一个坏想法)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多