Idataadapter и insertcommand
Привет, у меня есть абстрактный класс, который определяет несколько методов для обработки соединений с БД. У меня также есть несколько классов, которые используют его, например, один для SQL CE и другой для универсального типа подключения OleDb.
Итак, по абстрактному классу определим следующий метод:
public abstract IDbDataAdapter GetAdapter(string sql);
И производный класс cDbOle переопределяет этот метод следующим образом:
public override IDbDataAdapter GetAdapter(string sql) { if (!ConnectionOpen()) return null; OleDbCommand cmd = new OleDbCommand(sql, (OleDbConnection)Cnn); cmd.CommandType = CommandType.Text; if (_trans != null) cmd.Transaction = (OleDbTransaction)_trans; OleDbDataAdapter da = new OleDbDataAdapter(cmd); using (OleDbCommandBuilder cb = new OleDbCommandBuilder(da)) { cb.QuotePrefix = "["; cb.QuoteSuffix = "]"; da.InsertCommand = cb.GetInsertCommand(); da.DeleteCommand = cb.GetDeleteCommand(); da.UpdateCommand = cb.GetUpdateCommand(); } return da; }
В основном он работает нормально, за исключением InsertCommand и UpdateCommand. Фактически, пока я не верну его (а также не приведу его к IDbDataAdapter), команда InsertCommand будет в порядке, после чего ("return da") команда будет нулевой. То же самое для команды UpdateCommand.
Я думаю, что делаю все правильно, но я не знаю, как решить эту ошибку.
Что я уже пробовал:
В ролях
OleDbDataAdapter da = new OleDbDataAdapter(cmd)как
IDbDataAdapter da = new OleDbDataAdapter(cmd)
Gerry Schmitz
Не вижу, как определяется _trans. Ссылки на "бокс" выглядят подозрительно. Не могу понять, почему вы не используете "интерфейс" вместо абстрактных методов и т. д.
#realJSOP
Интерфейс против абстрактного - potay-toe, potah-toe в большинстве случаев.
Интерфейсы не могут иметь реализованных методов, поэтому, если вам это нужно, абстрактный механизм-это механизм перехода. С другой стороны, вы можете наследовать только от одного класса, но вы можете наследовать несколько интерфейсов.
Я в основном использую интерфейсы, когда хочу включить несхожие объекты в единую коллекцию сложных типов.
Я использую статические классы для своей функциональности DAL, потому что соединения являются временными. Таким образом, мне не нужно наследовать от базового класса (сохраняя это для действительно важных вещей).
Afzaal Ahmad Zeeshan
Интерфейсы не могут иметь реализованных методов,
Это спорно и зависит от языковой версии, которую вы используете.
Поддержка C# 8 интерфейс по умолчанию, который может иметь определение для методов и может делать то же самое, что и абстрактные типы, а также позволять типу осуществлять другой интерфейс. Абстрактные типы не позволят этому случиться.
#realJSOP
Мы уже обсуждали методы по умолчанию в интерфейсах здесь, в CP, и сочли их в целом бессмысленными. На самом деле мы также решили, что MS было бы лучше изменить еще несколько значков, а не реализовывать методы по умолчанию в интерфейсах.
Afzaal Ahmad Zeeshan
При всем уважении, это не отменяет аргумента о том, что интерфейсы могут быть реализованы. :-)
#realJSOP
То, что ты можешь, еще не значит, что ты должен.