Как сделать так, чтобы входные данные моих хранимых процедур не усекались?

Мы используем стандартные классы System.Data, DbConnection и DbCommand, для подключения к SQL Server из C#, и у нас есть много хранимых процедур, которые принимают VARCHAR или NVARCHAR параметры в качестве входных. Мы обнаружили, что ни SQL Server, ни наше приложение C# не выдают никаких ошибок или предупреждений, когда в качестве значения параметра передается строка, длина которой превышает максимальную длину параметра. Вместо этого значение молча усекается до максимальной длины параметра.

Так, например, если вход хранимой процедуры имеет тип VARCHAR(10) и мы передаем 'U R PRETTY STUPID', хранимая процедура получает входное значение как 'U R PRETTY', что очень мило, но совсем не то, что мы хотели сказать.

Что я делал в прошлом для обнаружения таких усечений, и что предлагали другие, так это делал длину входного параметра на один символ больше, чем требуется, а затем проверял, равна ли длина входного параметра этой новой максимальной длине. Таким образом, в приведенном выше примере мой входной параметр станет VARCHAR(11), и я буду проверять ввод длиной 11. Любой ввод длиной 11 или более будет отловлен этой проверкой. Это работает, но кажется неправильным. В идеале уровень доступа к данным должен обнаруживать эти проблемы автоматически.

Есть ли лучший способ обнаружить, что входные данные хранимой процедуры длиннее, чем разрешено? Разве DbCommand не должен уже знать об ограничениях длины входных данных?

Также, из любопытства, что отвечает за молчаливое усечение наших входных данных?

5
задан Nick Chammas 23 January 2012 в 21:49
поделиться