我有一个存储发票信息的数据库。每个发票最多可以有 5 个工作关系,每个工作都有一个唯一的 ID 号。
我执行了一条选择语句,选择了与一张发票相关的所有工作。
我已经尝试了很多方法来读取选定的作业 ID 并将它们存储在一个 jobArray 中。我更愿意使用 for 循环来选择它,但我尝试过的大多数方法都使用文本框(我用我的数组替换了它)
这是我最近的代码;
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() : "";
}
你能帮我解决这个问题吗?
为什么要使用数组?您可以使用 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();
我是一名优秀的程序员,十分优秀!