Динамическая установка параметра команды SQL DbType в С#?

Кажется, меня мучает этот вопрос, и хотя я понимаю, как это должно работать, я не вижу леса за деревьями..

В основном у меня есть ситуация, когда у меня есть хранимая процедура SQL 2008.. очень простая.. простые varchar, int и т. д. Поскольку я получаю данные значения/пары из javascript, конечно, я неявно не знаю DbType для установки. Я знаю, что это звучит немного странно, и технически я мог бы добавить какой-нибудь тег к имени поля, чтобы указать фактический тип.

Итак, сейчас я пытаюсь сделать следующее:

(Я использую блок доступа к данным корпоративной библиотеки, но db является объектом базы данных/объектом соединения) - также val/pairs взяты из хеш-таблицы.

db.DiscoverParameters(cmd);
IDictionaryEnumerator de;
de = PDMdata.GetEnumerator();
while (de.MoveNext())
{
    DbType ptype = cmd.Parameters[de.Key.ToString()].DbType;
    db.AddInParameter(cmd, de.Key.ToString(), ptype, (ptype)de.Value.ToString());
}

Для справки, db.AddInParameter принимает объект Command, имя параметра, тип параметра и значение параметра.

Как видите, я пытаюсь привести значение к правильному типу SQL DbType... но, конечно, он пытается использовать обычный тип С#.

Любые идеи преобразования значения в динамический SQL DbType??

Заранее спасибо за вашу помощь..


person Dav.id    schedule 20.02.2011    source источник


Ответы (2)


В коллекции SqlCommand.Paramaters есть метод AddWithValue(String name, Object value)... так что вы можете вообще пропустить SqlDbType, если хотите.

person canon    schedule 20.02.2011
comment
Привет, спасибо за ответ. Думаю, я что-то понял, но не совсем уверен в окончательных деталях. В основном я пытаюсь получить TypeCode DbType, а затем при преобразовании значения параметра я пытаюсь Convert.ChangeType(paramValue, TypeCode(Db Param))... но все еще продолжаю, потому что я, кажется, получаю int32 TypeCode для AnsiString DbType.. Еще раз спасибо за ответ! - person Dav.id; 20.02.2011
comment
Это удобный способ, но и опасный! Что произойдет, если вы пройдете, например. НУЛЕВОЕ значение?? Как SQL Server/ADO.NET узнает, какой тип вы хотите указать?? Я был бы очень очень осторожен с этим!! Я предпочитаю явно указывать свои типы данных, чтобы быть в безопасности! - person marc_s; 20.02.2011
comment
Если вы передаете значение null, sql обрабатывает его как значение null. - person canon; 24.02.2011

Хорошо, глупый я.. если я уже проверяю формат/качество данных во внешнем интерфейсе/промежуточном программном обеспечении, то я могу (потому что я использую Enterprise Library 5.0) .SetParameterValue(cmd, paramname, paramvalue) и обнаружение параметра займет забота об остальном...

Таким образом, в основном вместо использования Explicit .AddInParameter (которому требуется DbType), приведенное выше решение работает для меня ... может быть и для вас в этом сценарии.

person Community    schedule 20.02.2011
comment
Привет, на самом деле просматриваю, возможно, ничего ... просто в то время у меня были проблемы с типами данных и преобразованием значений в правильные типы ... так что, честно говоря, ваш ответ был таким же правильным, как и мой окончательный код db.SetParameterValue (cmd, @ + de.Key.ToString(), conval) (conval — это просто проверенное/преобразованное значение из коллекции params). Так что еще раз спасибо. - person Dav.id; 08.02.2012