根据条件(如“Saúde”之类的posicao,如convenio之类的convenio,我无法尝试将我的表(conta)的一行(Id)存储到我的数组(ids [])中,我遇到了一些麻烦有重复的ID)。变量“ e”和“ i”仅是会计师。我对编码有点陌生,所以请不要轻易判断我。这也是我在这个网站上的第一篇文章,而且我不太会英文。
这是我的代码:
// Here I select the number of Id's that are compatible with my requisites, so far so ok
cmd = new SqlCommand("select COUNT(Id) from contas where posicao like 'Saúde' and convenio like '" +convenio+"'", con);
cmd.Parameters.AddWithValue("@Id", Id);
numeroidentista = (cmd.ExecuteScalar()).ToString();
// Here I create my arrays to store the data
int[] ids = new int[Convert.ToInt32(numeroidentista)];
string[] idst = new string[Convert.ToInt32(numeroidentista)];
string[] inst = new string[Convert.ToInt32(numeroidentista)];
// And here I tryied so hard and it doesn't even matter
while (e < Convert.ToInt32(numeroidentista))
{
SqlCommand cmdao = new SqlCommand(inst[i].ToString(), con);
inst[i] = "SELECT Id FROM contas where posicao like 'Saúde' and convenio like '" + convenio + "' and Id > '" + ids[i] + "'";
SqlDataReader reader = cmdao.ExecuteReader();
if (reader.Read())
{
while (i < Convert.ToInt32(numeroidentista))
{
idst[i] = reader["Id"].ToString();
ids[i] = Convert.ToInt32(idst[i]);
i++;
}
}
e++;
reader.Close();
}
答案 0 :(得分:2)
您的代码有几个问题;但是,最主要的是,您在使用inst[i]
之前为其分配了一个值:
SqlCommand cmdao = new SqlCommand(inst[i].ToString(), con); // Using inst[i] here.
inst[i] = "SELECT Id FROM contas where posicao like 'Saúde' and convenio like '" + convenio +
"' and Id > '" + ids[i] + "'"; // But assigning it here.
交换行
inst[i] = "SELECT Id FROM contas where posicao like 'Saúde' and convenio like '" + convenio +
"' and Id > '" + ids[i] + "'";
SqlCommand cmdao = new SqlCommand(inst[i].ToString(), con);
由于inst[]
是一个字符串数组,因此无需转换为字符串:
SqlCommand cmdao = new SqlCommand(inst[i], con);
您还有其他多余的转化。您将已经是COUNT(id)
的{{1}}转换为字符串,只是稍后再将其转换为和int
:
int
将其更改为
//Not shown
string numeroidentista;
numeroidentista = (cmd.ExecuteScalar()).ToString();
int[] ids = new int[Convert.ToInt32(numeroidentista)];
我将使用可变大小列表(int numeroidentista = (int)cmd.ExecuteScalar();
int[] ids = new int[numeroidentista];
来代替固定大小的数组。这也将使第一个List<T>
变得多余。
另一个问题是表中的SELECT COUNT(Id)
是什么类型?您将其放在Id
数组中,但SQL用单引号将其引起来,表明它具有文本类型。它也应该在表中,并且在int
中,在这种情况下,SQL:int
中应该没有撇号。您还正在使用... and Id > " + ids[i];
来为其分配值。
最好在各处使用命令参数,而不是字符串连接。但是,由于要存储生成的SQL,因此您可能希望以这种方式保存它,以备将来参考。
为什么要使用3个不同的数组。通过在3个字段中使用类字符串,代码将变得更加容易。使用此类
ids[i]
您可以声明类似
的列表public class ContaInfo
{
public int Id { get; set; }
public string IdString { get; set; }
public string Instruction { get; set; }
}
,然后添加带有
的项目var contas = new List<ContaInfo>();
最后,使用语句会自动关闭和处置资源。
我试图重写代码;但是,我不理解所有这些背后的逻辑。您正在创建一个固定大小的数组,但是您有2个嵌套循环,有可能创建比数组大小更多的条目。
答案 1 :(得分:1)
1-您的代码中存在多个潜在问题。进行转换时,您相信字符串中的类型可以转换为所需的类型,例如int。示例是Convert.ToInt32(numeroidentista)
,Convert.ToInt32(idst[i])
,推荐的方法是使用TryParse进行这些操作,例如:
if(!Int32.TryParse(numeroidentista, out int numeroidentistaInt))
{
Console.WriteLine($"Error converting {numeroidentista} to int value");
return;
}
2-同样,为了提高效率,请仅执行一次转换,您已重复Convert.ToInt32(numeroidentista)
5次。只需在一次while循环之前执行一次即可。
3-最后,正如上面的注释所指出的,您尚未在使用inst数组之前对其进行初始化。
4-作为另一个技巧,使用常量和变量形成字符串时,请尝试使用$“”约定。例如,您可以将第一个字符串替换为$"select COUNT(Id) from contas where posicao like 'Saúde' and convenio like '{convenio}'"