discord.py
использует два разных класса для представления учетной записи, User
и Member
. Member
является подклассом User
. Объект User
представляет учетную запись пользователя (вы, я, бот), а объект Member
представляет состояние учетной записи на определенном сервере и включает в себя псевдонимы, роли, разрешения и т. Д.
Вы не можете забанить User
, потому что User
объекты не содержат никакой информации о сервере, с которого они должны быть забанены. Вместо этого вам нужно получить объект члена этого сервера. К счастью, у Server
объектов есть метод, который облегчает это
member = message.channel.server.get_member(line)
Я уже абстрагировал создание объектов SqlParameter повсюду в приложении, так что в этой точке я рассмотрю ввод. Мой метод абстракции создает и возвращает объект SqlParameter для использования в вызове хранимой процедуры. Если это varchar, который хочет вызывающий, я переберу каждый символ строки, которую они хотят преобразовать в объект SqlParameter, и отфильтрую эти недопустимые двоичные символы XML. Это исключит попадание неверных данных в базу данных.
How did the bad data get into the database? Are you using an XML column?
You can put the filtering (it's called "validation", actually) into the stored procedures used to enter data into the database, or you can add triggers to check the data regardless of where it comes from.
In general, don't allow bad data to get into the database!
Как ваша хранимая процедура создает XML? Если вы используете какой-либо параметр FOR XML в SQL Server, двоичные символы в текстовых полях будут правильно экранированы:
CREATE TABLE test (
id int identity(1,1) not null primary key,
data nvarchar(50))
INSERT INTO test (data) values (char(0))
SELECT * FROM test FOR XML RAW
выдает:
<row ID="1" data="�" />
Это вопрос кодирования? Или xml просто искажен? Если уродливый, я не могу помочь. Но для кодирования ... к сожалению, ExecuteXmlReader
не позволяет вам указать кодировку, но вы можете обрабатывать данные как BLOB и обрабатывать их отдельно с вашей собственной кодировкой и XmlReader
?
Если данные большие, вам, вероятно, следует использовать ExecuteReader
с CommandBehavior.SequentialAccess
и записать его во временный файл ( Path.GetTempFileName ()
) - затем обработайте этот файл как поток
с помощью XmlReader
.
Я видел, как DotNet SqlClient «скремблирует» данные из столбцов nvarchar в базе данных, наша теория это то, чем нужно заниматься с «суррогатными кодовыми точками» см .:
http://www.siao2.com/2005/07/27/444101.aspx
http://publib.boulder.ibm.com/infocenter/iseries/ v5r3 / index.jsp? topic = rzaaxsurrogate.htm
SqlClient, казалось, «интерпретировал» некоторые байты, означая, что наш Xml больше не был правильно сформирован, преобразование в nvarchar (max), похоже, остановило это (хотя это действительно повлияло на производительность):
SELECT CONVERT(NVARCHAR(MAX), MyValue) FROM ...
Обратите внимание, что вам нужно использовать NVARCHAR (MAX), NVARCHAR (N) не работает.
Мы также обнаружили, что провайдер OleDB также работает правильно (хотя он медленнее, чем SqlClient).