Чтобы добавить к тому, что другие опубликовали:
ExecuteScalar концептуально возвращает крайний левый столбец из первой строки набора результатов запроса; Вы можете выполнить ExecuteScalar для персонала SELECT * FROM, но вы получите только первую ячейку в результирующих строках
Обычно используется для запросов, которые возвращают одно значение. Я не уверен на 100% в SQLServer, но в Oracle вы не используете его для запуска FUNCTION (код базы данных, который возвращает одно значение) и ожидаете, что он даст вам возвращаемое значение функции даже хотя функции возвращают отдельные значения. Однако, если вы запускаете функцию как часть запроса, например, SELECT SUBSTR ('abc', 1, 1) FROM DUAL, тогда он даст возвращаемое значение в силу того факта, что возвращаемое значение хранится в самой верхней левой ячейке результирующего набора строк
ExecuteNonQuery будет использоваться для запуска хранимых процедур, функций и запросов базы данных, которые изменяют данные (INSERT / UPDATE / DELETE) или изменяют структуру базы данных (CREATE TABLE ...). Обычно возвращаемое значение вызова является показателем того, сколько строк было затронуто операцией, но проверьте документацию БД, чтобы гарантировать это