将数据从数据库表传递到数组

时间:2018-08-19 18:01:16

标签: c#

根据条件(如“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();
}

2 个答案:

答案 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}'"