我有一个名为'Code'的列,它存储在SQL中的'varchar'数据类型中。 我想从数组中找到最大代码。
因此,只要用户想要添加新项目,程序就会自动生成新代码。
直到第9号才正常工作。但是当我在代码中添加“10”时,它仍然将数字“9”视为最大值。并再次显示新项目的数字“10”。
检索字符串数组中的代码列
string commandString = "SELECT Distinct Code FROM Main_Family";
combobxMCode.Items.Clear();//first clear previous items then refill
// MessageBox.Show(commandString);
SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
sqlCon.Open();
SqlDataReader dr = sqlCmd.ExecuteReader();
while (dr.Read())
{
i = 1;
// Description = dr["Description"].ToString();
combobxMCode.Items.Add(dr[0]);
MCode = new string[] {dr["Code"].ToString()};
}
dr.Close();
查找最大代码,然后显示新的可用代码
int[] IntCode = Array.ConvertAll(MCode, int.Parse);
string MaxCode = (MCode.Max()).ToString();
Next_Code = int.Parse(MaxCode.ToString());
int show_code = Next_Code + 1;
combobxMCode.Text = show_code.ToString();
它将最大代码声明为9.数组中还有10和11。
我应该如何从数组中检索实际最大数量?
答案 0 :(得分:4)
如果您只需要最大的数字,那么您可以将查询重写为以下内容:
string commandString = "SELECT MAX(CAST(Code as INT)) FROM Main_Family";
然后,您只需在ExecuteScalar()
对象上调用SqlCommand
,然后将结果投放到int
。
要以更详细的方式解释,SELECT MAX()
将仅选择查询的最大值,而CAST([column/value] as [datatype])
会将其从一种数据类型强制转换为[datatype]
中指定的另一种数据类型。
然后你可以猜到,SELECT MAX()
只返回一个,最大的值,所以你只有一行,返回一列。这意味着您可以调用ExecuteScalar()
从结果表的第一行中检索第一个单元格。
由于您已将结果从varchar(n)
转换为int
,因此您可以轻松地对ExecuteScalar()
的结果执行相同操作,从而获得整数。< / p>
// modified query to get the biggest value
string commandString = "SELECT MAX(CAST(Code as INT)) FROM Main_Family";
combobxMCode.Items.Clear();
SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
sqlCon.Open();
如果您100%确定此表包含数据且结果不为null,请使用此命令:
int result = (int)sqlCmd.ExecuteScalar();
但是如果表中根本没有值,那么你应该进行一些安全检查:
int? result = sqlCmd.ExecuteScalar() as int?;
if(result.HasValue)
{
return result.Value;
}
return -1;
答案 1 :(得分:1)
您的MCode.Max()
调用尝试从MCode数组中获取最大值(顺便说一句,变量应以小写字母开头,而不是大写字母)。问题是,MCode数组不是整数数组,因此返回的最大值不是最大整数,而是最大字符串。字符串不像整数那样进行比较,所以&#34; 9&#34;被认为是最大的&#34;数组中的字符串,因此返回的字符串。你的MCode应该是一个int数组而不是一个String数组,这样就可以按照你想要的那样比较这些值,并得到正确的结果。
编辑:现在我重新阅读了你的代码,似乎你也在循环的每次迭代中分配一个新的新数组。如果我没弄错的话,电话
MCode = new string[] {dr["Code"].ToString()};
使MCode永远不会分配超过1个值。它只保留最后一个值。您应该使用List并在循环的每次迭代中添加它。
此外,正如m.rogalski指出的那样,有更有效,更快捷的方式来获取这些信息。
答案 2 :(得分:0)