Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

На C# из SQL сервера получаю данные и эти данные загоняю в ArrayList

76K
30 июня 2012 года
Hamo
19 / / 30.06.2012
Здравствуйте. На C# из SQL сервера получаю данные и эти данные загоняю в ArrayList. Потом из этого ArrayList нужно вывести в текстбоксе только один элемент ArrayList-а. Каждый раз в ArrayList попадает только одна строка из сервера и в этой строке есть данные, у которых типы разные, и integer и string есть. Скажите, как можно только соответствующие стринговыe элементы вывести в текстбоксе?
277
30 июня 2012 года
arrjj
1.7K / / 26.01.2011
is
76K
30 июня 2012 года
Hamo
19 / / 30.06.2012
этот ответ на мой вопрос не подходит
277
30 июня 2012 года
arrjj
1.7K / / 26.01.2011
OfType? (теже яйки только в профиль)
76K
30 июня 2012 года
Hamo
19 / / 30.06.2012
Цитата: arrjj
OfType? (теже яйки только в профиль)



это тоже не работает, а может нужно Sql тип преобразовать на нетовски? а потом загнать в ArrayList?

277
30 июня 2012 года
arrjj
1.7K / / 26.01.2011
Хз как у тебя там - код покажи как заполняешь - подумаем.
76K
01 июля 2012 года
Hamo
19 / / 30.06.2012
Цитата: arrjj
Хз как у тебя там - код покажи как заполняешь - подумаем.



Этот код в DAL.cs
internal ArrayList Serched(string nameMan)
{
ArrayList serched= new ArrayList();
using (SqlConnection con = new SqlConnection(connectionString))
{
SqlCommand com = new SqlCommand("StoredProcedure1", con);
com.CommandType = System.Data.CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();
param.ParameterName = "@nameMan";
param.Value = nameMan;
param.SqlDbType = System.Data.SqlDbType.NVarChar;
param.Direction = System.Data.ParameterDirection.Input;
com.Parameters.Add(param);

try
{
con.Open();
SqlDataReader dr = com.ExecuteReader();

if (dr.HasRows)
foreach (DbDataRecord result in dr)
serched.Add(result);
}
catch
{ }
}
return serched;
}

во втором файле

DAL dal = new DAL();

string nameMan = txbx_nameMan.Text.Trim();
ArrayList data= dal.Serched(nameMan);
if (data != null && data.Count != 0)
{
IEnumerable<string> query = data.OfType<string>();
foreach (string c in query)
{
textBox1.Text += c;
}
}
в хранимой процедуре такой запрос

ALTER PROCEDURE dbo.StoredProcedure1

(
@nameMan nvarchar(50)
)

AS
SELECT * FROM NameTable WHERE NameMan like '%'+@nameMan+'%'
RETURN

программа запускается, но в текстбоксе ничего нету

40K
01 июля 2012 года
D129
228 / / 18.04.2012
Какой вы хитрый. Хотите уже совсем только намекнуть - что вам хочется, а компилятор мол, сам понимай....
:-)

ArrayList data

В вашей программе содержит обьекты типа DbDataRecord , а вовосе не string.
Вот вам его линк-запрос и не приносит.

Или глубже лезть в DbDataRecord (извлекать из нее значение) или заполнять ArrayList не сырыми данными, а уже извлеченными.
Тогда в массиве будут в перемешку строки и числа, и линк запрос сумеет разобраться.
76K
01 июля 2012 года
Hamo
19 / / 30.06.2012
Цитата: D129
Какой вы хитрый. Хотите уже совсем только намекнуть - что вам хочется, а компилятор мол, сам понимай....
:-)

ArrayList data

В вашей программе содержит обьекты типа DbDataRecord , а вовосе не string.
Вот вам его линк-запрос и не приносит.

Или глубже лезть в DbDataRecord (извлекать из нее значение) или заполнять ArrayList не сырыми данными, а уже извлеченными.
Тогда в массиве будут в перемешку строки и числа, и линк запрос сумеет разобраться.



а как нужно это исправить?

40K
01 июля 2012 года
D129
228 / / 18.04.2012
foreach (DbDataRecord result in dr)
serched.Add(result[0]);

Хотябы так.
Индекс должен соответствовать возвращаемому запросу.
76K
01 июля 2012 года
Hamo
19 / / 30.06.2012
Цитата: D129
foreach (DbDataRecord result in dr)
serched.Add(result[0]);

Хотябы так.
Индекс должен соответствовать возвращаемому запросу.



Этот результат я использую в разных местах программы. Если через индекс задавать, то все в этих местах один и той же элемент будет вводится. Например, когда вытаскиваю один строка из базы, в этом строке 24 элемента есть, и 5 элементов из этого строка перемещается в листбоксе, и нужно, чтобы только один элемент вводилось в текстбоксе.

40K
01 июля 2012 года
D129
228 / / 18.04.2012
Вы странно поняли сущность DAL.
Разве он должен возвращать сырые данные, а не обьекты (и списки обьектов) со специфическими свойствами?

В случае когда у вас аж 24 поля в строке - как вы с ними обращаетесь? Это должен быть класс, с 24 свойствами, каждое с человеческим названием.
Это позволило бы уйти от индексов уже на уровне DAL и Модели.

А если этого нет - то что этот ДАЛ вам дал? Что он скрыл - строку подключения? Так это можно тогда и SqlConnection счиать DAL ом....
40K
01 июля 2012 года
D129
228 / / 18.04.2012
У вас DAL - он же и модель, судя по использованию его уже в коде формы.

Это не страшно, но тогда и абсолютно нормально делать в нем функции типа - GetDataForComboBox....

Кстати, я не увидел в вашем коде возможность как-то вызвать другую процедуру и как-то по другому заполнить ваш ArrayList Serched(string nameMan) ....
40K
01 июля 2012 года
D129
228 / / 18.04.2012
Я понял что вы имели в виду.
Ну тем более - тривиальная задача.
В 21 веке для нее существует EF 4 или (если вы не любите микрософт) nHibernate.

В любом случае - вам очень полезно было бы сделать класс User(NameTable) - со всеми необходимыми полями из NameTable
И везде выше DAL использовать его - и тогда запрос для заполнения текстбокса выглядел бы как-то так:

IEnumerable<string> query = from eachUser in dataFromDal select eachUser.Name
40K
01 июля 2012 года
D129
228 / / 18.04.2012
Ну и извините за критику - но как-то странно хранить-обрабатывать в одной и той же колонке разные типы.

Если дизайн полностью ваш, и хранимки тоже - такую кривость делать нельзя.
Это типичный пример создания работы на ровном месте.
76K
01 июля 2012 года
Hamo
19 / / 30.06.2012
Цитата: D129
Ну и извините за критику - но как-то странно хранить-обрабатывать в одной и той же колонке разные типы.

Если дизайн полностью ваш, и хранимки тоже - такую кривость делать нельзя.
Это типичный пример создания работы на ровном месте.



Ничего страшного, просто я только 2 месяца читаю C#, и потому мне трудно, еще логично, что не знаю все тонкости этого языка. Спасибо вам.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог