【问题标题】:Select 5 rows from database store each one in an array?从数据库中选择 5 行,每行存储在一个数组中?
【发布时间】:2013-05-03 13:21:56
【问题描述】:

我有一个存储发票信息的数据库。每张发票最多可以有 5 个工作关系,每个工作都有一个唯一的 ID 号。

我执行了一个 select 语句,选择了与单个发票相关的所有作业。

我尝试了很多方法来读取选定的作业 ID 并将它们存储在 jobArray 中。我希望它使用 for 循环进行选择,但我尝试过的大多数方法都使用 textBoxes(我用我的数组替换)

这是我最近的代码;

     SqlCeCommand cmdCountJobs = new SqlCeCommand("SELECT COUNT(Job_ID)AS INVCOUNT FROM Invoice WHERE Invoice_Number = " + maxInvoice + " ", cn);
        cmdCountJobs.Connection = cn;
        reader = cmdCountJobs.ExecuteReader();
        while (reader.Read())
        {
            countValue = Convert.ToInt32(reader["INVCOUNT"].ToString());
        }         
        SqlCeCommand cmdJobSearch = new SqlCeCommand("SELECT Job_ID as ID FROM Invoice WHERE Invoice_Number = " + maxInvoice + " ", cn);
        cmdJobSearch.Connection = cn;
        reader = cmdJobSearch.ExecuteReader(); 
        SqlCeDataAdapter da = new SqlCeDataAdapter(cmdJobSearch);
        jobArray[0] = (reader.Read()) ? reader["ID"].ToString() : "";
        jobArray[1] = (reader.Read()) ? reader["ID"].ToString() : "";
        jobArray[2] = (reader.Read()) ? reader["ID"].ToString() : "";
        jobArray[3] = (reader.Read()) ? reader["ID"].ToString() : "";
        jobArray[4] = (reader.Read()) ? reader["ID"].ToString() : "";   
        }

你能帮我解决这个问题吗?

【问题讨论】:

  • 在执行阅读器之前打开连接
  • 你为什么不能这样做for (i = 0; i < 5; i++) { jobArray[i] = (reader.Read()) ? reader["ID"].ToString() : ""; }
  • 您还可以考虑使用循环将作业分配给发票,这样如果某天发票的作业数量增加,您就不必过多地更改代码。
  • 你没有提到这个问题。你试过for循环......所以......?发生了什么?出了什么问题?
  • @noobob 是的,我已经打开了连接,但没有看到有必要发布它。

标签: c# sql arrays select sql-server-ce


【解决方案1】:

为什么要使用数组?您可以使用List(Of Int) 使用普通循环存储 ID 号。
鉴于列表的性质,您不需要事先知道设置数组大小的作业数量,因此您可以拥有只有 4 个作业或 6 个作业的发票,但您的代码逻辑不需要检查一下。

    List<int> jobs = new List<int>();
    SqlCeCommand cmdJobSearch = new SqlCeCommand("SELECT Job_ID as ID FROM Invoice " + 
                                "WHERE Invoice_Number = @ivc", cn);
    cmdJobSearch.Connection = cn;
    cmdJobSearch.Parameters.AddWithValue("@ivc", maxInvoice);
    reader = cmdJobSearch.ExecuteReader(); 
    while(reader.Read())
         jobs.Add(Convert.ToInt32(reader["ID"]));

另请注意,我已更改您的查询以避免字符串连接。可能情况并非如此,但使用参数化查询来避免Sql Injection 是一个好习惯

当然,如果您需要在代码的其余部分使用数组,您可以像数组一样轻松引用列表

   TextBox1.Text = jobs[0].ToString();

或将列表转换回数组

   int[] ids = jobs.ToArray();

【讨论】:

  • @Steve 列表中的这些值可以显示在单独的文本框中吗?
  • 当然可以,为什么不呢。 TextBox1.Text = jobs[0].ToString() 或者您可以使用 int[] ids = jobs.ToArray() 将列表转换回数组
  • @Steve 非常感谢,帮了大忙。
猜你喜欢
  • 2011-10-10
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多