Во втором фрагменте кода вы устанавливаете CommandText
из cmd
, но не устанавливаете CommandText
из command
. Это command
то, что вы затем передаете в адаптер данных. Почему у вас два командных объекта на первом месте? Если cmd
- это объект команды, для которого вы установили CommandText
, то, безусловно, это должен быть объект команды, который вы передаете в адаптер данных.
Объект подключения создает соединение между вашим приложением и базой данных. SQL может быть выполнено через это соединение, и данные передаются взад и вперед.
Объект команды содержит код SQL и, необязательно, параметры для этого SQL. Команда всегда связана с соединением, по которому она выполняется. Если команда содержит оператор SELECT
, вы можете вызвать ExecuteScalar
, чтобы получить одно значение, или ExecuteReader
, чтобы получить ноль, одну или несколько записей, содержащих один или несколько столбцов. Если команда не содержит оператора SELECT
, вы можете вызвать ExecuteNonQuery
.
Адаптер данных - это, как правило, группа из четырех командных объектов для выполнения операций CRUD. Когда вы вызываете Fill
, SelectCommand
выполняется для извлечения данных в DataTable
. При вызове Update
InsertCommand
, UpdateCommand
и DeleteCommand
выполняются в соответствии с требованиями для сохранения изменений из DataTable
в базу данных.
При создании адаптера данных вы можете либо предоставьте готовый объект команды для SelectCommand
, либо позвольте адаптеру создать его самостоятельно. Если вы сделаете последнее, вы можете передать код SQL и существующее соединение, или вы можете передать код SQL и строку соединения, в этом случае адаптер также создаст объект соединения. Адаптер данных не будет создавать свои собственные InsertCommand
, UpdateCommand
и DeleteCommand
, поэтому вам придется создавать их самостоятельно или, в определенных обстоятельствах, вы можете использовать построитель команд, чтобы сделать это за вас.
Вам может быть полезно взглянуть на мой ADO. NET примеры здесь .