Выполнение обновления PostgreSQL в C#
В настоящее время я работаю со своими товарищами по команде над проектом, касающимся связи между C# и базой данных PostgreSQL. У нас не было проблем с чтением базы данных через программу, но когда дело дошло до ее обновления, у нас возникла проблема. В нашей ситуации есть таблица с 2 столбцами, таблица называется acted, а столбцы - actor_id и movie_id. Мы используем метод Npgsql для подключения базы данных к нашей программе, и, несмотря на отсутствие ошибок, каждый раз, когда мы пытаемся обновить значение в столбце, на самом деле ничего не происходит, и значение остается неизменным.
Это метод, который мы используем
public List<string> PostgreSQLtest5() //endolse pros tin postgresql meros 1
{
String actcolumn = ??????;
String actnewvalue = ??????;
String actoldvalue = ??????;
try
{
string connstring = "Server=127.0.0.1; Port=5432; User Id=postgres; Password=72677267; Database=imdb;";
NpgsqlConnection connection = new NpgsqlConnection(connstring);
connection.Open();
NpgsqlCommand command = new NpgsqlCommand("UPDATE acted SET '"+actcolumn+"' = '"+actnewvalue+"' WHERE '"+actoldvalue+"'", connection);
NpgsqlDataReader dataReader = command.ExecuteReader();
connection.Close();
return dataItems;
}
catch (Exception msg)
{
MessageBox.Show(msg.ToString());
throw;
}
}
У нас есть 3 текстовых поля в другой форме с именем действовал. Что мы должны написать в вопросительных знаках в этих 3 переменных, чтобы получить ввод текстовых полей и заставить их работать?
2 ответа
Если вы посмотрите на свой SQL:
"UPDATE acted SET '"+actcolumn+"' = '"+actnewvalue+"' WHERE '"+actoldvalue+"'"
Это делает для:
UPDATE acted SET 'some_column' = 'some_value' WHERE 'some_condition'
Что в одинарных кавычках означает, что вы используете буквальные значения. 'some_column' не является столбцом - это статическое значение, и в этом контексте оно бессмысленно и должно выдавать ошибку.
Что вы, вероятно, имели в виду, это:
UPDATE acted SET some_column = 'some_value' WHERE <some_condition>
Который в терминах C# будет:
NpgsqlCommand command = new NpgsqlCommand("UPDATE acted SET "+actcolumn+" = '"+
actnewvalue+"' WHERE "+actoldvalue+"", connection);
Или, возможно, лучше написано как:
NpgsqlCommand command = new NpgsqlCommand(string.Format(
"UPDATE acted SET {0} = '{1}' WHERE {2}",
actcolumn, actnewvalue, actoldvalue), connection);
Или (немного размышляя здесь):
NpgsqlCommand command = new NpgsqlCommand(string.Format(
"UPDATE acted SET {0} = '{1}' WHERE {0} = '{2}'",
actcolumn, actnewvalue, actoldvalue), connection);
И даже лучше переписать, чтобы использовать параметры.
Проверьте этот пост для примера того, как пуленепробиваемый это немного:
Попробуйте это вместо этого:
NpgsqlCommand command = new NpgsqlCommand("UPDATE acted SET "+actcolumn+" = '"+actnewvalue+"' WHERE "+actoldvalue+", connection);