Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > получить данные из БД SQL server по значению textb


Автор: kama3uk 6.3.2013, 09:45
Добрый день. Сделал програмулину которая записывает инфу с текстбоксов в бд, все нормально работает.

Код

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection scn = new SqlConnection(" data source = ACY314_05_PGTKK;initial catalog = Test_db;integrated security = true ");
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.InsertCommand = new SqlCommand("insert into gaz values(@lch, @city, @street, @dom, @kv)", scn);
            sda.InsertCommand.Parameters.Add("@lch", SqlDbType.VarChar).Value = textBox1.Text;
            sda.InsertCommand.Parameters.Add("@city", SqlDbType.VarChar).Value=textBox2.Text;
            sda.InsertCommand.Parameters.Add("@street", SqlDbType.VarChar).Value=textBox3.Text;
            sda.InsertCommand.Parameters.Add("@dom", SqlDbType.VarChar).Value=textBox4.Text;
            sda.InsertCommand.Parameters.Add("@kv", SqlDbType.VarChar).Value = textBox5.Text;
            scn.Open();
            sda.InsertCommand.ExecuteNonQuery();
            scn.Close();
 
        }

по столбцу lch надо сделать поиск:
 в textbox(lch) вводим какоето значение и ищем его в lch как токо нашли выводим остальные строки по данному lch в textbox'ы.(city,street,dom,kv)
 Помогите реализовать! ! !


Делаю так 
Код

 SqlConnection scn = new SqlConnection(" data source=ACY314_05_PGTKK;" +
            "initial catalog = Test_db;integrated security = true ");
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.InsertCommand = new SqlCommand("SELECT * FROM gaz WHERE lch =",textBox1.Text);


но что то не так .

Автор: jsharp36 8.3.2013, 09:20
1.
Код

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection scn = new SqlConnection(" data source = ACY314_05_PGTKK;initial catalog = Test_db;integrated security = true ");
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.InsertCommand = new SqlCommand("insert into gaz values(@lch, @city, @street, @dom, @kv)", scn);
            sda.InsertCommand.Parameters.Add("@lch", SqlDbType.VarChar).Value = textBox1.Text;
            sda.InsertCommand.Parameters.Add("@city", SqlDbType.VarChar).Value=textBox2.Text;
            sda.InsertCommand.Parameters.Add("@street", SqlDbType.VarChar).Value=textBox3.Text;
            sda.InsertCommand.Parameters.Add("@dom", SqlDbType.VarChar).Value=textBox4.Text;
            sda.InsertCommand.Parameters.Add("@kv", SqlDbType.VarChar).Value = textBox5.Text;
            scn.Open();
            sda.InsertCommand.ExecuteNonQuery();
            scn.Close();
 
        }


не есть гуд. Прямо в обработчик кнопки встроено обращение к базе. А главное - используйте обязательно для типов, реализующих интерфейс IDisposable using. Любые внешние ресурсы должны гарантированно освобождаться, даже в случае ошибки. Конекшины тоже сюда относятся. Т.е. код надо писать где-то так:
Код

private void button1_Click(object sender, EventArgs e)
{
    using (SqlConnection scn = new SqlConnection(" data source = ACY314_05_PGTKK;initial catalog = Test_db;integrated security = true "))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            sda.InsertCommand = new SqlCommand("insert into gaz values(@lch, @city, @street, @dom, @kv)", scn);
            sda.InsertCommand.Parameters.Add("@lch", SqlDbType.VarChar).Value = textBox1.Text;
            sda.InsertCommand.Parameters.Add("@city", SqlDbType.VarChar).Value = textBox2.Text;
            sda.InsertCommand.Parameters.Add("@street", SqlDbType.VarChar).Value = textBox3.Text;
            sda.InsertCommand.Parameters.Add("@dom", SqlDbType.VarChar).Value = textBox4.Text;
            sda.InsertCommand.Parameters.Add("@kv", SqlDbType.VarChar).Value = textBox5.Text;
            scn.Open();
            sda.InsertCommand.ExecuteNonQuery();
            scn.Close();
        }
    }
}


2. 

Код

SqlConnection scn = new SqlConnection(" data source=ACY314_05_PGTKK;" +
            "initial catalog = Test_db;integrated security = true ");
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.InsertCommand = new SqlCommand("SELECT * FROM gaz WHERE lch =",textBox1.Text);

У  SqlCommand даже нет такого конструктора, который бы брал два стринга. Потом, вы устанавливаете в адаптер зачем-то InsertCommand. Вы же выборку делаете из таблицы, а не вставку?

Заводите в тексте запроса переменную, как обычно начинающуюся на знак @. Т.е. текст запрос будет выглядеть так: "SELECT * FROM gaz WHERE lch = @IchValue". С т.з. шарпа это просто стринг, без переменных. И добавляете параметр с таким же именем. Например, так:

Код

    DataSet dataSet = new DataSet();
    using (SqlConnection scn = new SqlConnection(" data source = ACY314_05_PGTKK;initial catalog = Test_db;integrated security = true "))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            sda.SelectCommand.Connection = scn;
            sda.SelectCommand = new SqlCommand("SELECT * FROM gaz WHERE lch = @IchValue");
            SqlParameter ichValueParameter = new SqlParameter("@IchValue", SqlDbType.VarChar);
            ichValueParameter.Value = textBox1.Text;
            sda.SelectCommand.Parameters.Add(ichValueParameter);

            scn.Open();
            sda.Fill(dataSet);
            scn.Close();
        }
    }


Должно работать. И убирайте звездочки в запросах. Нехорошо это. А также, судя по коду, вы используете какой-то тип в базе VARCHAR. Разрабатывайте сразу в юникоде. Зачем вам лишние проблемы. В базе используйте тип NVARCHAR, а на стороне шарпа соотвественно: SqlDbType.NVarChar

Автор: kama3uk 11.3.2013, 09:40
jsharp36 СПС огромное работает. А как сделать так: 
Я в textbox1 ввожу значение lch(к примеру "2")потом идет подключение к бд и по этому значению ищет нужную строку.Как только нашел строку со здначением "2",в остальные textbox'ы(city, street, dom, kv) выводит соответствующие данные.? 

Автор: jsharp36 12.3.2013, 01:45
Без никаких проблем. Я выше уже код показал.

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


На самом деле, хоть это и будет работать - это полная ерунда и учебный пример. Вы пробуйте. Но в реальных проектах никто датасетами не пользуется. 
Пользуются ORM. И Binding. Вот последнее, замечательно позволяет отображать на контролах данные без кодирования. 

Но. Пробуйте на датасетах. Надо поначалу руками всё попробовать и научиться, чтобы понимать, как что устроено.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)