Member 13285619 Ответов: 3

Сохранение возвращаемых значений из метода


Привет,

У меня есть событие нажатия кнопки, и значения, возвращаемые из метода, должны быть сохранены.Как я могу этого достичь?

Кнопка будет нажата несколько раз, я должен сохранить возвращаемое значение каждый раз, когда кнопка нажата
protected void AddRowToAddressee_Click(object sender, EventArgs e)
{
  try
  {
    string var = GenerateInsertSqlToAddressee();
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
}


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

//public class FrmKeys
//{
// public string savess { get; set; }
// //added below from potential fixes 

// //public static implicit operator FrmKeys(string v)
// //{
// // throw new NotImplementedException();
// //}

// //public void FrmKeys(string v)
// //{
// // //throw new NotImplementedException();
// //}
//}
//protected void AddNewFormKeys_Click(object sender, EventArgs e)
//{
// try
// {
// string savess = GenerateInsertSql2();

// FrmKeys frm = new FrmKeys();

// //FrmKeys InsrtAddFrmKeys = savess;

// //frm = GenerateInsertSql2();

// frm = savess;

// List<frmkeys> FormKeys = new List<frmkeys>();

// FormKeys.Add(frm);

// foreach (FrmKeys k in FormKeys)

// {
// Console.WriteLine(k);

// }

// }

// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// }

//}


ОБНОВЛЕНИЕ: Надстройка GenerateSqlToAddressee() от Комментарии
public string GenerateInsertSqlToAddressee() {
			string InsertSqlToAddressee = ""; //"not all code paths return a value on GenerateInsertSql()"

			try {

				//Data for ToAddressee TABLE

				string AddrTo_FORM_CODE = FormCodetxt.Text.ToUpper();
				int AddrTo_VERSION = Convert.ToInt32(FormVersiontxt.Text);
				string AddrTo_AddrCode = ddlAddresseecode.SelectedValue;

				int AddrTo_CREATED_BY = Convert.ToInt32(Createdbytxt.Text);

				DateTime dateOnly2 = DateTime.Parse(CreatedDttxt.Text).Date;
				DateTime timeOnly = DateTime.Now;
				DateTime AddrTo_CREATEDDT = dateOnly2.Date.Add(timeOnly.TimeOfDay);

				string AddrTo_Main;

				if (ChBMain.Checked) {

					AddrTo_Main = "T";

				}
				else {

					AddrTo_Main = "F";
				}


				InsertSqlToAddressee = "INSERT INTO EFILE.FORM_ADDRESSEE_TO (form_code, version, addressee_code, main, created_dt,created_by)" +
				" VALUES ('" + AddrTo_FORM_CODE + "'," + AddrTo_VERSION + ",'" + AddrTo_AddrCode + "'" + ",'" + AddrTo_Main
				+ "',TO_DATE('" + AddrTo_CREATEDDT + "', 'mm/dd/yyyy hh:mi:ss AM'),'" + AddrTo_CREATED_BY + "'); ";

			}


			catch (Exception ex) {
				Console.WriteLine(ex.Message);
			}

			return InsertSqlToAddressee; //"not all code paths return a value on GenerateInsertSql()"

		}

MadMyche

Вам нужно будет добавить к вашему вопросу такие вещи, как то, что именно вы хотите сохранить и где. Прямо сейчас вы вызываете какой-то метод, связанный с SQL, но, не видя этого метода, не имеете ни малейшего понятия, хотите ли вы сохранить текстовый файл или выполнить команду.

F-ES Sitecore

Где спас?

Member 13285619

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

публичная строка GenerateInsertSqlToAddressee()

{
string InsertSqlToAddressee = ""; //“не все пути кода возвращают значение в GenerateInsertSql()”

пробовать
{

//Данные для таблицы ToAddressee

строка AddrTo_FORM_CODE = FormCodetxt.Text.ToUpper();
int AddrTo_VERSION = конвертировать.ToInt32(FormVersiontxt.Text);
строка AddrTo_AddrCode = ddlAddresseecode.SelectedValue;

int AddrTo_CREATED_BY = конвертировать.ToInt32(Createdbytxt.Text);

DateOnly2 датавремя = Датавремя.Синтаксический Анализ(CreatedDttxt.Текст).Дата;
TimeOnly датавремя = Датавремя.Сейчас;
DateTime AddrTo_CREATEDDT = dateOnly2.Date.Add(timeOnly.TimeOfDay);

строка AddrTo_Main;

если (ChBMain.Проверен)
{

AddrTo_Main = "Т";

}
еще
{

AddrTo_Main = "Ф";
}


InsertSqlToAddressee = "вставить в EFILE.FORM_ADDRESSEE_TO (form_code, version, addressee_code, main, created_dt,created_by)" +
"Значения ('" + AddrTo_FORM_CODE + "'," + AddrTo_VERSION + ",'" + AddrTo_AddrCode + "'" + ",'" + AddrTo_Main
+ "',TO_DATE('" + AddrTo_CREATEDDT + "', 'mm/dd/yyyy hh:mi:ss AM'),' " + AddrTo_CREATED_BY + "'); ";

}


поймать (исключение бывший)
{
Приставка.WriteLine(напр.сообщение);
}

return InsertSqlToAddressee; //“не все пути кода возвращают значение в GenerateInsertSql()”






}

Richard Deeming

Не делай этого так!

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Member 13285619

Я это проверю.Чем Ты!

3 Ответов

Рейтинг:
2

MadMyche

!- НЕТ, НЕТ, НЕТ !
NEVER EVER постройте SQL - команду, собрав кучу пользовательского ввода в строку-это причина, по которой SQL-инъекция все еще находится в топ-10 уязвимостей приложений через 2 десятилетия после того, как она была идентифицирована.

Правильный способ создания команд и размещения в них значений будет заключаться в следующем Параметры

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

В части 1 мы создадим класс адресов для определения того, что такое адрес, а также методы создания и сохранения списка
1А. Создать Адрес класс, который параллелен данным в таблице базы данных

public class Addressee {
	string FormCode { get; set; }
	int Version { get; set; }
	string AddresseeCode { get; set; }
	string Main { get; set; }
	DateTime Created { get; set; }
	string CreatedBy { get; set; }

	public Addressee() { }
}




1Б. Добавьте перегруженный построить для простого населения
public Addressee(string formCode, int version, string addresseecode, string main, DateTime created, string createdBy) {
	FormCode = formCode;
	Version = version;
	AddresseeCode = addresseecode;
	Created = created;
	CreatedBy = createdBy;
}


1С. Добавить метод, чтобы сохранить адрес. (Я пропустил это)
1д. Добавить метод, чтобы сохранить список адресов
public void SaveAddressList(List<Addressee> addressees) {
	if ((addressees != null) && (addressees.Count > 0)) {

		string strSqlConnection = "placeholder";
		string Query = "INSERT INTO EFILE.FORM_ADDRESSEE_TO (form_code, version, addressee_code, main, created_dt,created_by) ";
		Query += "VALUES (@form_code, @version, @addressee_code, @main, @created_dt, @created_by";

		using (SqlConnection conn = new SqlConnection(strSqlConnection)) {
			using (SqlCommand cmd = new SqlCommand(Query, conn)) {
				conn.Open();
				foreach (Addressee a in addressees) {
					cmd.Parameters.AddWithValue("@form_code", a.FormCode);
					cmd.Parameters.AddWithValue("@addressee_code", a.AddresseeCode);
					cmd.Parameters.AddWithValue("@version", a.Version);
					cmd.Parameters.AddWithValue("@main", a.Main);
					cmd.Parameters.AddWithValue("@created_dt", a.CreatedDt);
					cmd.Parameters.AddWithValue("@created_by", a.CreatedBy);

					cmd.ExecuteNonQuery();

					cmd.Parameters.Clear();
				}
				conn.Close();
			}
		}
	}
}


Вторая часть будет состоять из изменений формы и кода, лежащих в основе вызова этого класса
2а. добавьте в класс список адресов
2b. заполните список в существующей программе
2С. Призыв "сохранить" способ, когда вы получите, что далеко.
private List<addressee> AddressList = new List<addressee>();

protected void AddRowToAddressee_Click(object sender, EventArgs e) {
	if ((Address == null) ||(AddressList == null)) { Address = new Addressee(); AddressList = new List<addressee>(); }
	try {
		//string var = GenerateInsertSqlToAddressee();
		AddressList.Add(GetAddress());
	}
	catch (Exception ex) {
		Console.WriteLine(ex.Message);
	}
}

protected void SaveAddressListRows(object sender, EventArgs e) {
	Address.SaveAddressList(AddressList);
}


Рейтинг:
1

Richard Deeming

Вот один из способов исправить уязвимость SQL-инъекции в вашем коде. Начните с пары вспомогательных классов:

public sealed class CommandParameter
{
    public CommandParameter(string name, object value)
    {
        Name = name;
        Value = value;
    }
    
    public string Name { get; }
    public object Value { get; }
}

public sealed class CommandDefinition
{
    public CommandDefinition(string commandText, CommandType commandType, params CommandParameter[] parameters)
    {
        CommandText = commandText;
        CommandType = commandType;
        Parameters = parameters;
    }
    
    public string CommandText { get; }
    public CommandType CommandType { get; }
    public IReadOnlyList<CommandParameter> Parameters { get; }
    
    public IDbCommand ToCommand(IDbTransaction transaction)
    {
        var command = transaction.Connection.CreateCommand();
        command.Transaction = transaction;
        command.CommandText = CommandText;
        command.CommandType = CommandType;
        
        foreach (CommandParameter parameter in Parameters)
        {
            IDbDataParameter p = command.CreateParameter();
            p.ParameterName = parameter.Name;
            p.Value = parameter.Value;
            command.Parameters.Add(p);
        }
        
        return command;
    }
}
Тогда измените свой GenerateInsertSqlToAddressee метод, чтобы возвратить экземпляр нового CommandDefinition класс, и измените свой список, чтобы хранить экземпляры этого класса:
private List<CommandDefinition> savedCommands = new List<CommandDefinition>();

protected void AddRowToAddressee_Click(object sender, EventArgs e)
{
    try
    {
        CommandDefinition cmd = GenerateInsertSqlToAddressee();
        if (cmd != null) savedCommands.Add(cmd);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

public CommandDefinition GenerateInsertSqlToAddressee() 
{
    try 
    {
        string AddrTo_FORM_CODE = FormCodetxt.Text.ToUpper();
        int AddrTo_VERSION = Convert.ToInt32(FormVersiontxt.Text);
        string AddrTo_AddrCode = ddlAddresseecode.SelectedValue;

        int AddrTo_CREATED_BY = Convert.ToInt32(Createdbytxt.Text);

        DateTime dateOnly2 = DateTime.Parse(CreatedDttxt.Text).Date;
        DateTime timeOnly = DateTime.Now;
        DateTime AddrTo_CREATEDDT = dateOnly2.Date.Add(timeOnly.TimeOfDay);

        string AddrTo_Main = ChBMain.Checked ? "T" : "F";
        
        return new CommandDefinition(
            @"INSERT INTO EFILE.FORM_ADDRESSEE_TO (form_code, version, addressee_code, main, created_dt, created_by)
              VALUES (@form_code, @version, @addressee_code, @main, @created_dt, @created_by)",
            CommandType.Text,
            new CommandParameter("@form_code", AddrTo_FORM_CODE),
            new CommandParameter("@version", AddrTo_VERSION),
            new CommandParameter("@addressee_code", AddrTo_AddrCode),
            new CommandParameter("@main", AddrTo_Main),
            new CommandParameter("@created_dt", AddrTo_CREATEDDT),
            new CommandParameter("@created_by", AddrTo_CREATED_BY)
        );
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex.Message);
        return null;
    }
}
Затем, когда вам нужно выполнить команды:
using (SqlConnection connection = new SqlConnection("..."))
{
    connection.Open();
    
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        foreach (CommandDefinition commandDefinition in savedCommands)
        {
            using (IDbCommand command = commandDefinition.ToCommand(transaction))
            {
                command.ExecuteNonQuery();
            }
        }
        
        transaction.Commit();
    }
}

РЕДАКТИРОВАТЬ: Я заметил, что вы отметили этот вопрос как "ASP.NET"; если это правильно, то вы не сможете сохранить список команд в поле на Вашей странице / контроллере, так как он будет потерян между запросами. Вместо этого вам нужно будет посмотреть на сохранение его в состоянии сеанса.


Рейтинг:
1

Gerry Schmitz

// Class level.
protected List<string> saved = new List<string>;
...
...
string var = GenerateInsertSqlToAddressee();
saved.Add( var );