【问题标题】:How do I use a C# Foreach loop to insert records into a database?如何使用 C# Foreach 循环将记录插入数据库?
【发布时间】:2017-10-05 22:10:00
【问题描述】:

我目前正在从事一个项目,该项目要求我使用具有以下要求的 WPF:

  1. 允许用户在堆栈面板中添加更多文本框
  2. 将每个文本框中的用户输入(作为字符串/nvarchar)保存为新记录 数据库

这背后的想法是,如果我们收到多个包裹,每批货物通常会分成多个位置,我们需要找到每个组件所在的位置。

我在下面包含了我的代码示例,它的准系统并且可能不仅仅是将要插入的“记录”字段。我已将 RecordID 字段设置为身份字段,因此我不担心声明 ID 字段。它不包含在示例中,但每条记录都链接到一个 ShipmentID。

如果我的代码遇到以下问题,我在实现它时遇到了麻烦(并且我的研究遇到了困难),我将不胜感激:

'System.InvalidOperationException'发生在 System.Data.dll' 中,CommandText 属性未初始化错误,当我尝试保存记录时。不幸的是,我只发现了如何解决我的问题的模糊花絮(或者我可能只是在研究方面很糟糕)。

    private void StackAddTB(object sender, RoutedEventArgs e)
    {
        TextBox NewBox = new TextBox() { Margin = new Thickness(0, 10, 0, 0), Width = 100, Height = 20 };
        StackBoxes.Children.Add(NewBox);
    }

    private void SaveMulti(object sender, RoutedEventArgs e)
    {
        string CStr = Manifesting.Properties.Settings.Default.PSIOpsSurfaceCS;
        SqlConnection Connection = new SqlConnection(CStr);
        string Query = "INSERT INTO TestLoop (Record), Values (Record)";
        SqlCommand Command = new SqlCommand(Query, Connection)

        foreach (TextBox TestTB in StackBoxes.Children.OfType<TextBox>())
        {
            try
            {
                Connection.Open();
                Command = Connection.CreateCommand();
                Command.Parameters.AddWithValue("@Record", TestTB.Text );
                Command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                Connection.Close();
            }
        }

编辑:我已经检查了循环文本框问题(根据 reds 先生的评论),虽然我从另一篇文章中发现了一些有用的东西,但它没有详细说明这些值是如何保存在一个分贝。

【问题讨论】:

  • Loop through Textboxes的可能重复
  • 而不是Connection.Open() 和您需要使用SqlConnection 对象SqlConnection.Open(); 的实例的所有其他连接代码,您还应该在循环之前打开连接,然后将连接包装在@ 987654325@ 语句,您不必手动关闭它。
  • 额外的逗号。 string Query = "INSERT INTO TestLoop (Record) -->,
  • @prospector 谢谢你的提示!
  • @AndrewHarris,我已经对语法进行了编辑,但遗憾的是我仍然遇到同样的错误

标签: c# sql wpf loops foreach


【解决方案1】:

首先,这就是我将如何构建您的代码。

    private void SaveMulti(object sender, RoutedEventArgs e)
    {
        string CStr = Manifesting.Properties.Settings.Default.PSIOpsSurfaceCS;
        string Query = "INSERT INTO TestLoop (Record) Values (@Record)";
        string Record = StackBoxes.Children.OfType<TextBox>().ToString();

        using(var conn = new SqlConnection(CStr))
        {
            foreach (TextBox TestTB in StackBoxes.Children.OfType<TextBox>())
            {
                using(var cmd = new SqlCommand(Query, conn))
                {
                    try
                    {
                        //Removed as pointed out by EJoshuaS
                        //cmd = conn.CreateCommand();
                        cmd.Parameters.AddWithValue("@Record", TestTB.Text);
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
        }
    }

接下来,这行的目的是什么?

string Record = StackBoxes.Children.OfType<TextBox>().ToString();

【讨论】:

  • 我没有坐在 IDE 前,但我认为这将与 OP 的原始代码存在完全相同的问题。
  • @EJoshuaS 请注意他们打开和关闭连接但重用命令的事实。他还缺少记录之前的@,因此“cmd.Parameters.AddWithValue("@Record", TestTB.Text);" 不存在参数行。
  • 刚看到你的答案...是的,你是对的...应该知道了。
  • @AndrewHarris 感谢您迄今为止的 cmets。只是为了清除字符串 record = stackboxes.etc 行的目的是在参数中使用 TestTB.Text 点,但它也不起作用。我将编辑帖子以将其删除。干杯
  • @AndrewHarris 我已经根据你们各自在我的 IDE 中重新编辑了格式,现在可以使用了。非常感谢您对这位菜鸟程序员的帮助! :)
【解决方案2】:

当你这样做时:

 Command = Connection.CreateCommand();
  Command.Parameters.AddWithValue("@Record", TestTB.Text );
  Command.ExecuteNonQuery();

您“破坏”之前在Command 中的任何内容,因此您永远不会在任何地方指定实际查询是什么。这就是它给你异常的原因 - 你实际上没有给它运行任何查询。

注意这一行:

 SqlCommand Command = new SqlCommand(Query, Connection);

目前没有任何区别。

【讨论】:

  • 感谢您告知我这一点。我会做一些改变,希望它能解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多