Как вы узнали, ошибка связана с тем, что m["Capacity"]
является неподписанным, не подписанным, Int64. Чтобы исправить, просто используйте класс Convert
следующим образом:
Capacity = new SqlInt64(Convert.ToInt64(m["Capacity"]));
Freespace = new SqlInt64(Convert.ToInt64(m["Freespace"]));
Я проверил это с вашим кодом, получил ту же ошибку, прежде чем вносить какие-либо изменения, а затем внес изменения, рекомендованные выше, и теперь я получаю правильный вывод.
Хотя это и не является частью проблемы, но в целом (изначально был входной параметр String Querytext
): для входных параметров / типов возврата, пожалуйста, используйте типы Sql*
вместо собственных типов для большинства типов данных (object
для SQL_VARIANT
и DateTime
для DATETIME2
являются заметными исключениями). Таким образом, используйте SqlString
вместо String
для параметра Querytext
(или просто удалите входной параметр, поскольку он не используется). Вы можете получить собственный .NET string
из параметра, используя свойство Value
(например, Querytext.Value
), которое есть во всех типах Sql*
(которое возвращает ожидаемый собственный тип в каждом случае).
Для получения дополнительной информации об использовании SQLCLR, пожалуйста, посетите: Информация SQLCLR
ОДНАКО, и, возможно, что еще более важно: глядя на то, что именно вы запрашиваете через WMI, похоже, что вы получаете информацию, для которой уже есть DMV, sys.dm_os_volume_stats
. Вы можете получить точно такую же информацию для всех дисков / томов, на которых у вас уже есть файлы, с помощью следующего запроса:
SELECT DISTINCT vol.[volume_mount_point], vol.[volume_id], vol.[logical_volume_name],
vol.[file_system_type], vol.[total_bytes], vol.[available_bytes],
(vol.[total_bytes] - vol.[available_bytes]) AS [used_bytes]
FROM sys.master_files files
CROSS APPLY sys.dm_os_volume_stats(files.[database_id], files.[file_id]) vol