Причина в том, что остальная часть строки не извлекается fgets()
, если она больше переданного буфера и, следовательно, остается во входном буфере вашего файлового потока stdin; впоследствии преобразования scanf()
не удаются.
Вам придется обнаружить этот случай (например, проверив, является ли последний символ в вашей только что прочитанной строке не новой строкой) и очистить входной буфер до следующей новой строки, например, вызвав getchar()
в цикл до новой строки (или EOF). Затем позвоните scanf()
.
Пример кода (непроверенный и EOF-проверка по-прежнему отсутствует):
fgets(ID, sizeof(ID), stdin);
if (ID[strlen(ID)-1] != '\n') {
while (getchar() != '\n')
;
}
И не забудьте проверить возвращаемые значения ваших вызовов scanf()
, чтобы увидеть, если преобразования были успешными!
Вот статья MSDN:
Как к: вызовите пользовательские встроенные функции (LINQ к SQL)
Примечание от той же страницы:
Хотя можно вызвать пользовательские встроенные функции, функции, которые включены в запрос, выполнение которого задерживается, не выполняются, пока запрос не выполняется. Для получения дополнительной информации посмотрите Введение в Запросы LINQ.
Когда Вы вызываете ту же функцию вне запроса, LINQ к SQL создает простой запрос из выражения вызова метода
Кроме того, смотрите на эти 13 минимальных скринкастов.
Можно добавить UDF's к LINQ к SQL файл DBML точно так же, как Вы добавляете таблицы и sprocs.
Они затем становятся исполняемыми методами на DataContext.
Google имеет много статей, как это.