На C# из SQL сервера получаю данные и эти данные загоняю в ArrayList
это тоже не работает, а может нужно Sql тип преобразовать на нетовски? а потом загнать в ArrayList?
Этот код в 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
программа запускается, но в текстбоксе ничего нету
:-)
ArrayList data
В вашей программе содержит обьекты типа DbDataRecord , а вовосе не string.
Вот вам его линк-запрос и не приносит.
Или глубже лезть в DbDataRecord (извлекать из нее значение) или заполнять ArrayList не сырыми данными, а уже извлеченными.
Тогда в массиве будут в перемешку строки и числа, и линк запрос сумеет разобраться.
:-)
ArrayList data
В вашей программе содержит обьекты типа DbDataRecord , а вовосе не string.
Вот вам его линк-запрос и не приносит.
Или глубже лезть в DbDataRecord (извлекать из нее значение) или заполнять ArrayList не сырыми данными, а уже извлеченными.
Тогда в массиве будут в перемешку строки и числа, и линк запрос сумеет разобраться.
а как нужно это исправить?
serched.Add(result[0]);
Хотябы так.
Индекс должен соответствовать возвращаемому запросу.
serched.Add(result[0]);
Хотябы так.
Индекс должен соответствовать возвращаемому запросу.
Этот результат я использую в разных местах программы. Если через индекс задавать, то все в этих местах один и той же элемент будет вводится. Например, когда вытаскиваю один строка из базы, в этом строке 24 элемента есть, и 5 элементов из этого строка перемещается в листбоксе, и нужно, чтобы только один элемент вводилось в текстбоксе.
Разве он должен возвращать сырые данные, а не обьекты (и списки обьектов) со специфическими свойствами?
В случае когда у вас аж 24 поля в строке - как вы с ними обращаетесь? Это должен быть класс, с 24 свойствами, каждое с человеческим названием.
Это позволило бы уйти от индексов уже на уровне DAL и Модели.
А если этого нет - то что этот ДАЛ вам дал? Что он скрыл - строку подключения? Так это можно тогда и SqlConnection счиать DAL ом....
Это не страшно, но тогда и абсолютно нормально делать в нем функции типа - GetDataForComboBox....
Кстати, я не увидел в вашем коде возможность как-то вызвать другую процедуру и как-то по другому заполнить ваш ArrayList Serched(string nameMan) ....
Ну тем более - тривиальная задача.
В 21 веке для нее существует EF 4 или (если вы не любите микрософт) nHibernate.
В любом случае - вам очень полезно было бы сделать класс User(NameTable) - со всеми необходимыми полями из NameTable
И везде выше DAL использовать его - и тогда запрос для заполнения текстбокса выглядел бы как-то так:
IEnumerable<string> query = from eachUser in dataFromDal select eachUser.Name
Если дизайн полностью ваш, и хранимки тоже - такую кривость делать нельзя.
Это типичный пример создания работы на ровном месте.
Если дизайн полностью ваш, и хранимки тоже - такую кривость делать нельзя.
Это типичный пример создания работы на ровном месте.
Ничего страшного, просто я только 2 месяца читаю C#, и потому мне трудно, еще логично, что не знаю все тонкости этого языка. Спасибо вам.