Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
1

Возвращение результата, после записи/обновления/чтения в БД

04.04.2013, 14:29. Просмотров 1332. Ответов 16
Метки нет (Все метки)

Суть вопроса. Я записываю данные с полей на форме, нужно чтобы после записи в БД, на страницу выводилось сообщение: "Ваша заявка принята! Номер обращения: <ID_Заявки>", где <ID_Заявки> это поле id в базе данных, под которой была записана эта запись.

Вот код ASPX:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@ Page Title="Домашняя страница" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Index.aspx.cs" Inherits="_Default" %>
 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <style type="text/css">
        .style1
        {
            height: 25px;
        }
    </style>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <div>
        <table>
            <tr>
                <td>
                    Ваша фамилия:
                </td>
                <td>
                    <asp:TextBox ID="txtName" runat="server" Width="178px"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td style="vertical-align: top">
                    Описание проблемы:
                </td>
                <td>
                    <asp:ListBox ID="txtText" runat="server" Height="178px" Width="321px"></asp:ListBox>
                </td>
            </tr>
        </table>
        <br />
        <asp:Button ID="btnInsert" runat="server" Text="Insert" OnClick="btnInsert_Click" /><br />
        <asp:Label ID="lblErrMsg" runat="server" Text="lblErrMsg" ForeColor="#FF3300" Visible="False"></asp:Label><br />
       
    </div>
</asp:Content>
Вот код CS
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        lblErrMsg.Visible = false;
    }
    protected void btnInsert_Click(object sender, EventArgs e)
    {
 
        SqlConnection thisConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);
*
        //Create Command object
        SqlCommand nonqueryCommand = thisConnection.CreateCommand();
*
        try
        {
            // Open Connection
            thisConnection.Open();
*
            // Create INSERT statement with named parameters
            nonqueryCommand.CommandText = "INSERT  INTO Zayavka (Name, Text) VALUES (@Name, @Text)";
*
            // Add Parameters to Command Parameters collection
            nonqueryCommand.Parameters.Add("@Name", SqlDbType.VarChar, 10);
            nonqueryCommand.Parameters.Add("@Text", SqlDbType.VarChar, 30);
*
            nonqueryCommand.Parameters["@Name"].Value = txtName.Text;
            nonqueryCommand.Parameters["@Text"].Value = txtText.Text;
*
            nonqueryCommand.ExecuteNonQuery();
        }
*
        catch (SqlException ex)
        {
            // Display error
            lblErrMsg.Text = ex.ToString();
            lblErrMsg.Visible = true;
        }
*
        finally
        {
            // Close Connection
            thisConnection.Close();
*
        }
    }
}
Поле id автоинкрементное, поэтому я его нигде не запрашиваю и соответственно не вывожу.
Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2013, 14:29
Ответы с готовыми решениями:

Возвращение результата из функции после срабатывания ивента
Добрых времени суток. Вопрос звучит немного каряво, однако есть функция, которая включает камеру на...

Ошибка при сохранении после чтения-записи в Excel
Добрый день! Имеется две кнопки, одна для записи в эксель, другая для чтения оттуда (используя...

После ОpenFileDialog меняется директория для чтения/записи файлов О.о
Здравствуйте. У меня в программе есть компонент OpenFileDialog. После его использования допустим...

Возвращение id последней записи
Нужно возвратить идентификатор последней записи поля IDEducation Пишу так: cn.execute('insert...

Возвращение уникального ID после Insert Into
Где-то видел ответ на свой вопрос, а вот сейчас не могу найти... Мне нужно получить уникальный ID...

16
kontuPauk
303 / 301 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
Завершенные тесты: 1
04.04.2013, 14:44 2
C MSSql все просто. Запрос
SQL
1
2
3
INSERT  INTO Zayavka (Name, Text) 
OUTPUT inserted.id 
VALUES (@Name, @Text)
А получить его можно, сколько я помню, заменив ExecuteNonQuery на
C#
1
int id_receipt = (int)cmd.ExecuteScalar();
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
04.04.2013, 15:19  [ТС] 3
Поправка. В коде ASPX вместо
HTML5
1
<asp:ListBox ID="txtText" runat="server" Height="178px" Width="321px"></asp:ListBox>
нужно
HTML5
1
<asp:TextBox ID="txtText" runat="server" Width="178px"></asp:TextBox>
Добавлено через 3 минуты
Цитата Сообщение от kontuPauk Посмотреть сообщение
OUTPUT inserted.id
Окей, с возвратом выражения понял, в этой стркое какраз возврат id.

На счет
Цитата Сообщение от kontuPauk Посмотреть сообщение
А получить его можно, сколько я помню, заменив ExecuteNonQuery на
Код C#
1
int id_receipt = (int)cmd.ExecuteScalar();
Не совсем...

Добавлено через 28 минут
Спасибо получилось! =)
0
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
04.04.2013, 16:36  [ТС] 4
Другой вопрос по той же теме.
Ввожу в поле id и хочу получить по нему информацию с помощью select. Для этого использую SqlDataReader (может я неправильно понял его назначение?).
Мне нужно вывести результат в Label.
В итоге в лейбл записалось следующее: "System.Data.SqlClient.SqlDataReader"

Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection thisConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);
 
        SqlCommand nonqueryCommand = thisConnection.CreateCommand();
 
        try
        {
            
            thisConnection.Open();
 
            nonqueryCommand.CommandText = "SELECT Comment FROM Zayavka WHERE id=@id";
            nonqueryCommand.Parameters.Add("@id", SqlDbType.VarChar, 10);
            nonqueryCommand.Parameters["@id"].Value = Nomer.Text;
            SqlDataReader read = nonqueryCommand.ExecuteReader();
            Label1.Text = read.ToString();
            Label1.Visible = true;
        }
 
        catch (SqlException ex)
        {
            // Display error
            lblErrMsg.Text = ex.ToString();
            lblErrMsg.Visible = true;
        }
 
        finally
        {
            // Close Connection
            thisConnection.Close();
        }
    }
Что я делаю не так? Спасибо!
0
kontuPauk
303 / 301 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
Завершенные тесты: 1
04.04.2013, 16:40 5
Два варианта. Первый:
C#
1
Label1.Text = (string)read["Comment"];
Второй, если уверены, что запись есть и одна, можно не использовать DataReader:
C#
1
Label1.Text = (string)nonqueryCommand.ExecuteScalar();
DataReader полезен, если нужно вернуть несколько полей и/или записей...
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
04.04.2013, 16:43  [ТС] 6
Цитата Сообщение от kontuPauk Посмотреть сообщение
nonqueryCommand.ExecuteScalar();
Вот! Именно то, что я и искал. Весь msdn обрыл
Диплом пишу на языке, который не изучал)
0
Aloir
219 / 219 / 38
Регистрация: 17.12.2010
Сообщений: 710
04.04.2013, 16:45 7
C#
1
2
3
var vValue = read[0].ToString(); // можно так
var vValue = read["Comment"].ToString(); // можно так
var vValue = read.GetString(0); // можно так, не помню где индекс столбца тока)
0
kontuPauk
303 / 301 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
Завершенные тесты: 1
04.04.2013, 16:47 8

Не по теме:

Диплом? То есть Student543... 2... 1... :)



Добавлено через 2 минуты
Цитата Сообщение от kontuPauk Посмотреть сообщение
Два варианта. Первый:
C#
1
Label1.Text = (string)read["Comment"];
Кстати, ведь соврал, данные-то не прочитаны:
C#
1
2
3
if (read.Read()) 
     Label1.Text = (string)read["Comment"];
read.Close();
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
04.04.2013, 18:19  [ТС] 9
Цитата Сообщение от kontuPauk Посмотреть сообщение

Не по теме:

Диплом? То есть Student543... 2... 1... :)

Не по теме:

5 лет назад регистрировался на скорую руку :D Курсовой по Pascal горел.



Всеже взял второй способ, потому что решил еще дату выводить.
Мой вариант:
C#
1
Label1.Text = read.GetDateTime(1).ToString("yyyy-MM-dd HH:mm tt") + (string)read["Comment"];
0
kontuPauk
303 / 301 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
Завершенные тесты: 1
04.04.2013, 19:30 10
Конечно, тут все-таки надо порекомендовать придерживаться единого стиля. То есть, либо:
C#
1
Label1.Text = read.GetDateTime(1).ToString("yyyy-MM-dd HH:mm tt") + (string)read.GetString(0);
либо
C#
1
Label1.Text = ((DateTime)read["dateColumn"]).ToString("yyyy-MM-dd HH:mm tt") + (string)read["Comment"];
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
08.04.2013, 16:00  [ТС] 11
Вопрос чисто для общего развития: Зачем указывается тип в параметрах для записи БД, если он указан в самой БД?
Код такой:
C#
1
2
3
4
5
nonqueryCommand.CommandText = "INSERT INTO Zayavka (Name, Text, dataN, type) OUTPUT inserted.id VALUES (@Name, @Text, GetDate(), @Type)";
*
            nonqueryCommand.Parameters.Add("@Name", SqlDbType.VarChar, 50);
            nonqueryCommand.Parameters.Add("@Text", SqlDbType.VarChar, 50);
            nonqueryCommand.Parameters.Add("@Type", SqlDbType.Int, 1);
И еще вопрос. Допустим я в БД указал для поля Text тип VarChar(MAX), тогда какую длинну указать в строке:
C#
1
nonqueryCommand.Parameters.Add("@Text", SqlDbType.VarChar, ???);
0
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
08.04.2013, 21:55  [ТС] 12
Появилась проблема с обработкой результатов в GridView
Описание: Если добавить событие RowDataBound(код его ниже), то GridView перестает выполнять команду:
MySQL
1
UPDATE Zayavka SET status=1, del=1, dataK=GetDate() WHERE id=@id
Выдает ошибку SQL: Запись с таким ключом уже существует.
При этом при редактировании конкретной строки в режиме Edit, никаких ошибок не возникает. СКОРЕЕ ВСЕГО это связано с тем, что там по другому устроено представление у столбца Type:
HTML5
1
2
3
4
5
<EditItemTemplate>
                        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="Types" DataTextField="name"
                            DataValueField="id" SelectedValue='<%# Bind("type") %>'>
                        </asp:DropDownList>
                    </EditItemTemplate>

Вот конфликтующий код:(если его удалить, то ошибка пропадает.)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
            if (e.Row.RowState == DataControlRowState.Normal ||
                e.Row.RowState == DataControlRowState.Alternate)
            {
                DataView ds =
        (DataView)Types.Select(DataSourceSelectArguments.Empty);
                // получить значение текущей категории
                DataRowView view = (DataRowView)e.Row.DataItem;
                int catid = (int)view.Row[6];
                // отфильтровать нужную категорию
                ds.RowFilter = string.Format("id='{0}'", catid);
                Label Text1 = (Label)e.Row.FindControl("Type");
                Text1.Text = ds[0].Row["name"].ToString();
            }
    }
Вот представление поля Type:
HTML5
1
2
3
<ItemTemplate>
          <asp:Label ID="Type" runat="server" Text='<%# Bind("name") %>'></asp:Label>
</ItemTemplate>
Вот полный код страницы:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<%@ Page Title="а" Language="C#" MasterPageFile="~/Site.master"
    AutoEventWireup="true" CodeFile="TechPanel.aspx.cs" Inherits="_Default" %>
 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <div>
        <h2>
            Обзор нерешенных проблем
        </h2>
        <asp:GridView ID="GridView1" runat="server" DataSourceID="sdsCurrent" DataKeyNames="id"
            AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None"
            AllowPaging="True" AllowSorting="True" OnRowDataBound="GridView1_RowDataBound">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:CommandField ButtonType="Image" DeleteImageUrl="~/images/button-cancel.png"
                    ShowDeleteButton="True" ShowEditButton="True" EditImageUrl="../images/button-edit.png"
                    UpdateImageUrl="../images/button-save.png" CancelImageUrl="../images/button-back.png"
                    HeaderText="Управление" FooterStyle-Width="64">
                    <FooterStyle Width="64px"></FooterStyle>
                </asp:CommandField>
                <asp:BoundField DataField="id" HeaderText=" Номер заявки " InsertVisible="False"
                    SortExpression="id" ReadOnly="True" />
                <asp:TemplateField HeaderText=" Тип " InsertVisible="False" SortExpression="type">
                    <EditItemTemplate>
                        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="Types" DataTextField="name"
                            DataValueField="id" SelectedValue='<%# Bind("type") %>'>
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Type" runat="server" Text='<%# Bind("name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="dataN" DataFormatString="{0:f}" HeaderText=" Дата обращения "
                    InsertVisible="False" ReadOnly="True" />
                <asp:BoundField DataField="dataK" DataFormatString="{0:f}" HeaderText=" Последнее изменение "
                    InsertVisible="False" ReadOnly="True" NullDisplayText="Нет изменений" />
                <asp:BoundField DataField="Name" HeaderText=" От кого " InsertVisible="False" ReadOnly="True" />
                <asp:BoundField DataField="Text" HeaderText=" Описание проблемы " InsertVisible="False"
                    ReadOnly="True" />
                <asp:BoundField DataField="Comment" HeaderText=" Комментарий специалиста " InsertVisible="False"
                    NullDisplayText="Нет заметок для этой проблемы." />
                <asp:CheckBoxField DataField="status" HeaderText=" Текущий статус " InsertVisible="False" />
            </Columns>
            <EditRowStyle BackColor="#CCFFCC" BorderColor="#0066FF" BorderStyle="Dotted" />
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#EFF3FB" BorderColor="Black" BorderStyle="Groove" BorderWidth="1px" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
        </asp:GridView>
        <asp:SqlDataSource ID="sdsCurrent" runat="server" DataSourceMode="DataSet" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
            SelectCommand="SELECT [id], [Name], [Text], [Comment], [dataN], [dataK], [type], [status] FROM [Zayavka] WHERE status=0"
            UpdateCommand="UPDATE Zayavka SET status=@status, type=@type, Comment=@Comment, dataK=GetDate() WHERE id=@id"
            DeleteCommand="UPDATE Zayavka SET status=1, del=1, dataK=GetDate() WHERE id=@id">
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="Types" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>"
            SelectCommand="SELECT [id], [name] FROM [Type]"></asp:SqlDataSource>
    </div>
</asp:Content>
Добавлено через 22 минуты
Кстати, если на кнопку УДАЛЕНИЯ назначить оператор SELECT, то результат тот же самый.
0
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
15.04.2013, 18:32  [ТС] 13
Новый вопрос, старые не актуальны!
Я использовал стандартную авторизацию, которая реализована в исходном веб-проекте.
Как мне вытащить ID(или хотя бы ИМЯ) текущего авторизованного пользователя?
Т.е. предположим, по нажатию кнопки я записываю данные в БД с помощью INSERT, как мне в поле user таблицы table1 записать ID текущего пользователя, который внес эту запись?
0
sau
2021 / 1634 / 271
Регистрация: 22.07.2011
Сообщений: 6,206
Завершенные тесты: 1
15.04.2013, 18:49 14
Page.UserIdentity.Name - логин.
В стандартной структуре членства логин уникален, если прям таки ID нужен , то:
Membership.GetUser().ProviderUserKey
http://msdn.microsoft.com/ru-ru/libr...eruserkey.aspx
Если свой провайдер, то и методы свои...
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
16.04.2013, 11:06  [ТС] 15
Цитата Сообщение от sau Посмотреть сообщение
Page.UserIdentity.Name - логин.
В стандартной структуре членства логин уникален, если прям таки ID нужен , то:
Membership.GetUser().ProviderUserKey
http://msdn.microsoft.com/ru-ru/libr...eruserkey.aspx
Если свой провайдер, то и методы свои...
Ну а как более правильно сделать? Записывать логин? Но в таком случае если пользователь сменит логин, то записей по нему из другой таблицы уже не найти, поэтому и хотел чтобы связующим звеном был именно ID, а он у таблицы юзеров Uniq типа.(Ну допустим я просто могу в таблицу добавить автоинкрементное поле Iduser самостоятельно и использовать его.)
Также не совсем понял как в запрос вида INSERT into [table1] ([pole1]) VALUES (<ID_или_ИМЯ_Текущего_пользователя >) воткнуть этого самого пользователя? Сперва передать значение в некий параметр @pole1 или еще как?
0
Haravodec
27 / 27 / 5
Регистрация: 11.09.2012
Сообщений: 107
18.04.2013, 21:37 16
в мембершипе этим id является Guid вот его и используйте как уникальный идентификатор
как писали выше Membership.GetUser().ProviderUserKey, у GetUser() есть также несколько перегрузок
1
Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 53
07.05.2013, 14:06  [ТС] 17
==//== удалено!
0
07.05.2013, 14:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2013, 14:06

Организация запросов чтения и записи к базе
Доброе время суток ! Пишу Web-сервис(ASP.NET 2.0, ADO.NET 2.0) работающий с базой (MS SQL Server...

Попытка чтения или записи в защищенную память
Вот юзаю код из DLL И пишет такую ошибку public string Get(string site, CookieCollection...

Измерить скорость чтения и записи данных на диск
Определить скорости чтения и записи блока данных доступных для чтения и записи логических дисков....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru