Веб-форма не обновляет таблицы, почему? - PullRequest
0 голосов
/ 11 апреля 2010

У меня есть веб-приложение, и на странице есть страница обновления, чтобы обновить некоторую информацию профиля. Ниже приведен код, который я использую для обновления таблицы. Но я думаю, что это неправильно. Что-нибудь торчит? Строка подключения работает, потому что она используется для чтения базы данных, чтобы получить информацию о профиле, я просто удалила ее, так как она содержит пароль / данные для входа в базу данных.

player - это класс свойств, который содержит информацию об игроке, а ds - это набор данных, но я бы хотел обновить саму базу данных онлайн ...

 Dim connectionString As String = ""

 Dim GigsterDBConnection As New System.Data.SqlClient.SqlConnection(connectionString)
 GigsterDBConnection.Open()
 Dim updatetoursql As String = "UPDATE PLAYERS SET FIRSTNAME = '" & player.FIRSTNAME & "', LASTNAME =  '" & player.LASTNAME & "', ADDRESS = '" & player.ADDRESS & "', CITY =  '" & player.CITY & "', ZIP = '" & player.ZIP & "', PHONE =  '" & player.PHONE & "', EMAIL = '" & player.EMAIL & "', REFFEREDBY =  '" & player.REFEREDBY & "' "

 updatetoursql = updatetoursql & "PLAYERID = '" & player.PLAYERID & "';"

 Dim cmd As New System.Data.SqlClient.SqlCommand(updatetoursql, GigsterDBConnection)
 Dim sqlAdapter As New System.Data.SqlClient.SqlDataAdapter(cmd)
 sqlAdapter.Update(ds, "PLAYERS")

Я думаю, что проблема в чем-то в 3 последних строках кода. я делаю это правильно или это лучший способ?

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 апреля 2010

Ну, кроме вопиющих проблем с внедрением SQL, ожидающих вас укусить ..... (подсказка: использовать параметризованные запросы вместо того, чтобы объединять ваш оператор SQL !!)

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)
Dim sqlAdapter As New SqlDataAdapter(cmd)

Проблема здесь в следующем: если вы вызываете конструктор SqlDataAdapter таким образом, вы передаете команду select (адаптера данных), а не команду обновления!

Вам нужно сделать это следующим образом:

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)
Dim sqlAdapter As New SqlDataAdapter()
sqlAdapter.UpdateCommand = cmd;

Теперь вы связали свое заявление UPDATE с SqlDataAdapter.UpdateCommand и теперь оно должно работать.

О внедрении SQL: я бы настоятельно рекомендовал бы постоянно использовать параметризованные запросы - по крайней мере, в рабочем коде. Поэтому вместо того, чтобы объединять ваш запрос, используйте это:

Dim updatetoursql As String = 
   "UPDATE PLAYERS SET FIRSTNAME = @FirstName, LASTNAME = @LastName, " & 
   "ADDRESS = @Address, CITY = @City, ZIP = @Zip, PHONE = @Phone " &
   "EMAIL = @EMail, REFFEREDBY = @ReferredBy, PLAYERID = @PlayerID"

и затем перед выполнением команды или оператора SqlDataAdapter.Update установите для этих параметров те значения, которые у вас есть. Это намного безопаснее и дает меньше головной боли и, возможно, даже улучшения скорости (если этот единственный запрос на обновление кэшируется только один раз в памяти SQL Server).

Кроме того, зачем вообще идти длинным и сложным путем SqlDataAdapter ??

После того как вы создали SqlCommand и настроили все параметры, просто наберите cmd.ExecuteNonQuery(); и все готово!

Dim cmd As New SqlCommand(updatetoursql, GigsterDBConnection)

// set up the parameters here.....
cmd.Parameters.AddWithvalue("@FirstName", FirstName);
... etc.

// just call ExecuteNonQuery - and you're done!
cmd.ExecuteNonQuery();
1 голос
/ 11 апреля 2010

Меня бросает в глаза тот факт, что SQL-инъекция атакует этот код.

Не следует строить строку SQL таким образом, а использовать параметризованные запросы .

Кроме того, вы неправильно строите свой адаптер, так как конструктор будет принимать команду select , а не команду обновления. Создайте команду с помощью конструктора без параметров, затем присвойте созданную команду свойству UpdateCommand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...