MaximusDebois Ответов: 2

Как передать значение в строку в методе


у меня есть метод, который берет значение из базы данных и передает его в строку в аргументе метода. Но это всегда приводит к 0. В моей базе данных есть таблица под названием account со столбцом под названием [New Balance]. У меня есть запрос для извлечения значения из этого столбца, который выдает вывод 500 и передает значение в строку в аргументе метода, чтобы при вызове метода я мог передать значение из строки в текстовое поле.

Что я уже пробовал:

public void AVinfo(string str)
        {
            
            decimal paValue;
            try
            {
                con = new SqlConnection(DAL.DBConn);
                con.Open();
                string ct = "SELECT [New Balance] From Account Where WithdrawalID = (SELECT Max(WithdrawalID) From Account)";
                cmd = new SqlCommand(ct);

                cmd.CommandType = CommandType.Text;
                cmd.CommandText = ct;
                cmd.Connection = con;

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                da.Fill(dt);
                
                con.Close();
                string newval = dt.Rows[0]["New Balance"].ToString();
                str = newval.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

Когда я вызываю этот метод, я хочу поместить значение str в textbox.text
любить
AVinfo(textbox.text)

2 Ответов

Рейтинг:
1

RickZeeland

Ты наверное хочешь этого:

textbox.text = AVinfo();

public string AVinfo()
{
  // ... your code
  return str;
}

Возможны и другие способы передачи параметра по ссылке: https://www.dotnetperls.com/parameter[^]


Рейтинг:
0

OriginalGriff

Это происходит потому, что параметры всегда передаются по значению, а не по ссылке. И если вы подумаете об этом, это имеет большой смысл.
Если вы напишете такой метод, как этот:

private void Double (int x)
   {
   x = x + x;
   }
Вы могли бы назвать это так:
int i = 666;
Double(i);
И можно было бы ожидать, что после этого мне исполнится 1332 год. Но если это сработает, что произойдет, если вы сделаете это:
Double(666);
Ясно, что вы не хотите пытаться изменить значение констант!
Поэтому, когда вы передаете значение - из любого источника - в метод в качестве параметра, оно копируется, а копия передается вместо этого: это называется "передача по значению" вместо "передача по ссылке", где передается фактический элемент.
Вы не можете вызвать Double с константой или переменной, потому что это не имеет значения - значение вне метода не будет затронуто никакими изменениями внутри него - потому что это копия, которая передается, а не "реальная вещь".

У вашего метода есть то же самое: ваша строка передается по значению в метод - отправляется копия - и любые изменения не передаются обратно во внешний мир, поэтому значение, которое вы даете методу, не передается обратно во внешний мир. str отбрасывается при выходе из метода.

Есть два способа "исправить" это: передать его по ссылке или вернуть как значение.
Чтобы пройти по ссылке, вы делаете это:
public void AVinfo(ref string str)
И назовите это так:
string str = "";
AVinfo(ref str);
И теперь изменения в str внутри вашего метода повлияют на внешнюю переменную.

Поскольку вы не используете существующее значение, вы можете сделать это с помощью параметра out:
public void AVinfo(out string str)
И назовите это так:
string str;
AVinfo(out str);

Но лучший способ-это вернуть значение, а не изменять его.
public string AVinfo()
   {
   ...
   return str;
   }

И назовите это так:
string str = AVinfo();


MaximusDebois

спасибо, чувак, это сработало.

OriginalGriff

Всегда пожалуйста!