2016-08-29 1 views
0

У меня проблема с передачей аргумента классу. Я хочу передать каждую итерацию, которая заполнит массив.Передача аргумента методу класса

private string[,] links; 

      for (int i = 0; i < 40; i++) 
      { 
       links = sql.Link(i); 
      } 

И это метод внутри другого класса:

public string[,] Link(int i) 
{ 
    SqlCommand sqlCommand = new SqlCommand(); 
    string[,] array = new string[40,40]; 
    int num = 0; 
    sqlCommand.Connection = this.conn; 
    sqlCommand.CommandText = "SELECT TOP (40) Link FROM dbo.Links"; 
    SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); 
    while (sqlDataReader.Read()) 
    { 
     array[i,num] = sqlDataReader.GetValue(0).ToString();       
     num++; 
    } 
    sqlDataReader.Close(); 
    return array; 
} 

Дело в том, что Links массив содержит только нули.

При изменении прохождения коды:

links = sql.Link(0); 

Тогда каждый индекс от 0,0 до 0,39 правильно заполнен. Но почему прохождение не работает должным образом?

+0

Вы уверены, что проверите ссылки [39,0] .. [39,39] после цикла I <40. Что вы пытаетесь сделать, зачем выполнять тот же Sql 40 раз? – Serg

ответ

0

Так, в следующей строке

string[,] array = new string[40,40]; вы создаете новый массив и возвращает то же самое.

Таким образом, во время первой итерации цикла for в массиве ссылок links = sql.Link(i); ссылки будут содержать значения для ссылок [0, 0] по ссылкам [0, 39], но в следующей итерации, когда возвращается новый объект массива, ссылки будут теперь укажем на этот новый объект (который будет содержать значения для [1, 0] - [1, 39]).

В вашем текущем случае после завершения завершения операции lop переменная массива ссылок содержит значения для [39, 0] - [39, 39], но не другие.

Возможные подходы

Решение, чтобы получить массив и объединить его с предыдущим. два подхода приведены ниже для справки:

1) возвращение массив для индекса в одной итерации, а затем объединить с предыдущими данными

private string[,] links = links[40, 40]; 

for(int i = 0; i < 40; i++) 
{ 
    string[] linksPart = Link(i); 

    for(int j = 0; j < 40; j++) 
    { 
     links[i, j] = linksPart[j]; 
    } 
    // here, your links array variable contain values from [0, 0] through [40, 40] 

    //...rest of the code. 
} 

string[] Link(int i) 
{ 
    string[] linkParts = new string[40]; 

    //connection open and populate array code goes here 
} 

2) передача массива в качестве параметра, чтобы связать функцию

private string[,] links = links[40, 40]; 

for(int i = 0; i < 40; i++) 
{ 
    Link(i, links); 

    // here, your links array variable contain values from [0, 0] through [40, 40] 

    //...rest of the code. 
} 

string[] Link(int i, string[,] arr) 
{ 
    // no need to create a new array 

    //connection open and other code (before sqlDataReader.Read() line) 
    while (sqlDataReader.Read()) 
    { 
     arr[i , num] = sqlDataReader.GetValue(0).ToString(); 
     num++; 
    } 

    //rest of the code and return statement 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^