Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / динамически подсунуть dbtype / 14 сообщений из 14, страница 1 из 1
22.01.2015, 17:56
    #38860981
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Подмогните по шарпу, плз. Пишу с телефона, поэтому теги использовать не могу, постараюсь просто текстом.
Вобщем задачка такая: есть табличка с колонками dt и есть массив sqlparameter[] par. Надо перебрать колонки dt и параметры в par. По ходу перебора если имя колонки совпадёт с именем параметра - сунуть в этот параметр значение из этой колонки. Всё просто вроде бы, но никак не получается при присвоении
рar[i].value=dr[columnname], где dr - datarow in dt
сконвертить dr[columnname] под тип par[i].dbtype, который заранее неизвестен и определяется по ходу перебора массива par. Подскажите как в конвертации использовать динамический тип данных.
...
Рейтинг: 0 / 0
22.01.2015, 18:15
    #38861005
PA
PA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
...
Рейтинг: 0 / 0
22.01.2015, 18:19
    #38861010
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Что-то вроде этого

Код: c#
1.
2.
foreach (DataColumn cl in dt.Columns) 
     sqlparameter["@"+cl.Name].value = dt.Row[какой-то][cl.Name]
...
Рейтинг: 0 / 0
22.01.2015, 18:24
    #38861015
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
PA Convert.ChangeType там надо Type, а мне надо DbType, потому как Type от par[i] будет SqlParameter
...
Рейтинг: 0 / 0
22.01.2015, 18:27
    #38861017
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
sposadPA Convert.ChangeType там надо Type, а мне надо DbType, потому как Type от par[i] будет SqlParameter
Я не понимаю проблему с типами.

sqlparameter[...].value - объект
dt.Row[...][...] - объект

Какие проблемы с приведением?
...
Рейтинг: 0 / 0
22.01.2015, 18:27
    #38861018
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Cat2Что-то вроде этого

Код: c#
1.
2.
foreach (DataColumn cl in dt.Columns) 
     sqlparameter["@"+cl.Name].value = dt.Row[какой-то][cl.Name]

млин, да я ж пишу, что как перебрать и присвоить я знаю, мне надо присваиваемое значение сконвертить под тот тип данных, который определится в параметре по ходу.
...
Рейтинг: 0 / 0
22.01.2015, 18:27
    #38861020
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
sposadмлин, да я ж пишу, что как перебрать и присвоить я знаю,
Cat2Я не понимаю проблему с типами.

sqlparameter[...].value - объект
dt.Row[...][...] - объект

Какие проблемы с приведением?
...
Рейтинг: 0 / 0
22.01.2015, 18:35
    #38861033
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Cat2sposadпропущено...
там надо Type, а мне надо DbType, потому как Type от par[i] будет SqlParameter
Я не понимаю проблему с типами.

sqlparameter[...].value - объект
dt.Row[...][...] - объект

Какие проблемы с приведением?ты думаешь, что этой проблемы не будет? Я вообще привык с шарпе к малине прибавлять малину, не надеясь, что она сама своих опознаша. В вб мож и прокатило бы, а тут скорее всего будут проблемы, особенно где дата попадётся.

Хоспаде, до чего же говённый инет у мтс
...
Рейтинг: 0 / 0
22.01.2015, 21:10
    #38861172
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
sposadВ вб мож и прокатило бы, а тут скорее всего будут проблемы, особенно где дата попадётся.

В параметрах sqlCommand тоже прокатывает. Разумеется если только в параметре не стоит тип Дата, а в соответствующем поле таблицы - "Осень"

Причем вот такой кусок

Код: c#
1.
2.
3.
SqlConnection con = new SqlConnection();
SqlCommand sqlCommand  = new SqlCommand("@par", con);
sqlCommand.Parameters.Add("Select @par", SqlDbType.DateTime).Value = "Осень";



Не вызовет ошибки во время выполнения, ошибка будет только при попытке выполнить sqlCommand.
...
Рейтинг: 0 / 0
22.01.2015, 21:47
    #38861197
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Cat2sposadВ вб мож и прокатило бы, а тут скорее всего будут проблемы, особенно где дата попадётся.

В параметрах sqlCommand тоже прокатывает. Разумеется если только в параметре не стоит тип Дата, а в соответствующем поле таблицы - "Осень"

Причем вот такой кусок

Код: c#
1.
2.
3.
SqlConnection con = new SqlConnection();
SqlCommand sqlCommand  = new SqlCommand("@par", con);
sqlCommand.Parameters.Add("Select @par", SqlDbType.DateTime).Value = "Осень";



Не вызовет ошибки во время выполнения, ошибка будет только при попытке выполнить sqlCommand.попробую, но всё равно, даже если получится, вопрос интересный, торкнуло меня, хочу разобраться, может где понадобиться.
...
Рейтинг: 0 / 0
23.01.2015, 06:05
    #38861318
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
sposad,

SqlParameter сам подбирает DbType по фактическому типу переданного значения, который редко когда бывает именно object:
Код: c#
1.
2.
3.
4.
5.
6.
var dt = new DataTable();
dt.Columns.Add("foo", typeof (int));
var dr = dt.NewRow();
dr["foo"] = 1;
dt.Rows.Add(dr);
Console.WriteLine(dt.Rows[0]["foo"].GetType());


- догадайтесь с трех раз, что выведет вышеприведенное. Указывать явно тип параметра требуется достаточно редко - например, когда нужно передать Size параметра, или задать ParameterDirection, или если параметр - табличный тип.
sposadвопрос интересный, торкнуло меня, хочу разобраться, может где понадобиться.
Просто линейный код по соответствию тип CLR - DbType. Посмотрите, например, исходники Dapper - там примерно так и делается:
Код: c#
1.
2.
3.
4.
5.
6.
7.
static SqlMapper()
{
  typeMap = new Dictionary<Type, DbType>();
  typeMap[typeof(byte)] = DbType.Byte;
  typeMap[typeof(sbyte)] = DbType.SByte;
  typeMap[typeof(short)] = DbType.Int16;
........
...
Рейтинг: 0 / 0
23.01.2015, 06:09
    #38861320
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
P.S. Таблицу соответствия типов см. здесь: https://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx
...
Рейтинг: 0 / 0
23.01.2015, 09:12
    #38861371
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Сон Веры Павловны,

спасибо!
...
Рейтинг: 0 / 0
23.01.2015, 14:06
    #38861752
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамически подсунуть dbtype
Parameters.AddWithValue - сам определит подходящий тип
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / динамически подсунуть dbtype / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]