使用文本框控件asp.net插入数据库

时间:2018-06-12 17:02:01

标签: c# asp.net

我正在尝试将控件文本框中的数据插入到数据库表中;但是说用户选择他们想要的文本框;然后文本框中的一个ID输入一行,另一个ID输入数据库的另一行,我希望它输入为ID1和ID2。我有3列,用户可以在ID中输入;例如,他们选择1个文本框,然后输入该文本框中的数据,其他列保持为空。

更新

using (var command = new SqlCommand("PP_CreateIDNumber", connection))
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@usernum", lblSheet.Text);

                        int counter = 1;
                        foreach (TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>())
                        {
                                string seal = string.Format("@seal{0}", counter++);
                                command.Parameters.AddWithValue(seal, textBox.Text);

                                command.ExecuteNonQuery();
                         }

}

foreach (TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>())
{
    using (SqlCommand comm = new SqlCommand("PP_CreateIDNumber", connection))
    {                  
            comm.CommandType = CommandType.StoredProcedure;

            comm.Parameters.AddWithValue("@userNum", lblUser.Text);
            comm.Parameters.AddWithValue("@ID1", textBox.Text);
            comm.Parameters.AddWithValue("@ID2", textBox.Text);
            comm.Parameters.AddWithValue("@ID3", textBox.Text);

            comm.ExecuteNonQuery();
            comm.Parameters.Clear();
        }
    }    
}

存储过程

@usernum varchar(20),
    @ID1 nchar(10),
    @ID2 nchar(10),
    @ID3 nchar(10),



AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    insert into Student values(@usernum, @ID1,@ID2, @ID3)

enter image description here

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么我相信你想要这样的东西:

    using (var command = new SqlCommand("PP_CreateIDNumber", connection)) {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@userNum", lblUser.Text);

        int counter = 1;
        foreach(TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>()) {
            command.Parameters.AddWithValue($"@ID{counter++}", textBox.Text);
        }

        command.ExecuteNonQuery();
    }

如果您无法以我上面使用的方式访问支持字符串插值的框架版本,则可以使用string.Format("@ID{0}", counter++),这对任何框架版本都应该足够。

您还应该考虑迭代文本框的顺序以及是否需要强制执行特定订单。您还应该考虑验证文本框的数量不会超过要插入数据的外键列的数量。最后,您应该考虑该表的设计是否实际上是最佳的。由于您在这里持有许多外键,因此您应该考虑使用专为一对多关系设计的表。

不熟悉您的架构使得很难在此处提供特定的建议,但考虑一个具有UserNum列和Id列的表(甚至可能是指示身份序列/顺序的附加列) 。不使用一行来保存数据,而是使用许多行。我不知道你的要求,也不知道你的架构,所以我感到很羞怯地推动你进行一个可能不必要的重新设计表,但你至少应该考虑它是否适用于此。

最后,请考虑不在用户界面中执行数据访问。让您的用户界面引用一个单独的程序集,该程序集包含了解如何为UI提供所需数据的类。

所有这一切,我相信代码示例可以帮助您实现目前的目标。

在实质性问题和对话后编辑:

您需要为尚未选择的文本框数量提供其他参数。

int maxPossibleTextBoxCount = 3;
int selectedTextBoxCount = ContentPlaceHolder1.Controls.OfType<TextBox>().Count();
int emptyTextBoxCount = maxPossibleTextBoxCount - selectedTextBoxCount;

using (var command = new SqlCommand("PP_CreateIDNumber", connection)) {
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@userNum", lblUser.Text);

    int counter = 1;

    // Here we add the parameters for the selected textboxes.
    foreach(TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>()) {
        command.Parameters.AddWithValue($"@ID{counter++}", textBox.Text);
    }

    // Here we add the parameters for the non-selected textboxes.
    if(emptyTextBoxCount > 0) {
        for(int i = 0; i < emptyTextBoxCount - 1; i++) {
            command.Parameters.AddWithValue($"@ID{counter++}", System.DBNull.Value);
        }
    }

    command.ExecuteNonQuery();
}