Kanomar Ответов: 1

Изменение изображения на основе значения int БД, связанного с определенным идентификатором


Всем привет,

я пытаюсь вывести наш локальный пользовательский интерфейс (приложение WPF) в интернет. (Только для местных целей, нет доступа с www, так что вопросы безопасности не являются большой проблемой банкомата).

Я использовал asp.net с помощью c# для этого все работало нормально (в основном gridviews и layout), пока мне не пришлось делать обзорную графику (технический обзор туннеля).

Как изменить imageurl в соответствии со значением int определенной таблицы в базе данных? И мне нужно сделать это, связанное с ID.

Imagecontrol --> дает жестко закодированный ObjectID для --> Codebehind (C#) --> генерирует Imageurl для этого идентификатора на основе значения int "строка базы данных" --> возвращает imageurl в imagecontrol.

Я не хочу использовать UniqueID или что-то в этом роде

Никакого вмешательства пользователя, кроме масштабирования, это просто обзорная графика, которая обновляется каждые x секунд (я не знаю, как это сделать, например, когда изменяется запись в базе данных).

Я много гуглил, но всегда речь идет о том, как привязать графику к gridview или как показать изображение из базы данных.

Помощь была бы очень признательна, так как я не настоящий программист, но я показал кое-что из того, что я сделал, своему боссу, и ему это понравилось, и он хотел, чтобы я сделал это с технической обзорной картой, а теперь я действительно застрял и не могу ухватиться за нее.

Чтобы сделать его более ясным, есть около 50+ маленьких изображений на фоновом изображении. Фон статичен, остальные 50+ изображений время от времени меняются и могут иметь до 15 различных состояний.
Значения для этих 50 изображений хранятся в базе данных MSSQL 2012, и существуют ocs-процессы, которые обновляют таблицы базы данных.


Таблица базы данных выглядит так:

Systime
Удостоверение личности (свойства primarykey)
Соллист
Стеллкод
Funktionsbyte

Я хочу получить данные из базы данных в коде позади вот так:
using (SqlCommand command = new SqlCommand("SELECT Id, SollIst ,Funktionsbyte, Stellcode FROM Stellzustand WHERE Id = '" + ID_property_of_image + "' and SollIst = 1 ", connection))


После этого я хочу установить url-адрес в соответствии со значениями базы данных:

if funktionsbyte == 1 return ~/images/Stellcode+Funktionsbyte.png

                    else return ~/images/ID+Black.png





С уважением,
Деннис

Что я уже пробовал:

Прочтите около 50 различных статей, чтобы понять это, может быть, я слишком туп, чтобы увидеть связь между моей проблемой и прочитанными предложениями.

Пытался сделать это с ЭВАЛОМ, но изображение ничего не показывает, должно быть, я пропустил СТХ. и это не очень элегантное решение, как мне кажется.

<pre>    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TrafficCenterConnectionString1 %>" SelectCommand="SELECT  Stellzustand.id, Stellzustand.Stellcode, Stellzustand.Funktionsbyte, FROM Stellzustand WHERE SollIst = 1 AND ID = 137496" />

   <asp:image id="Image1" runat="server" imageurl='<%# String.Format("~/images/Funktionsbyte={0} & Stellcode={1}", Eval("Funktionsbyte"), Eval("Stellcode" +".png")) %>'  />

Mike V Baker

Если я правильно вас понял, вы берете идентификатор из элемента управления, imagecontrol. Я не уверен, что понимаю логику здесь. Идентификатор элемента управления не имеет ничего общего со значениями в базе данных. Идентификатор элемента управления существует только для того, чтобы C# codebehind мог однозначно идентифицировать каждый элемент управления в форме. Такие вещи, как comboBox1, comboBox2, imageControl1 и т. д. (Кстати, я всегда предлагаю называть их тем, что они содержат, cbUserNames).
Что я всегда делал в этом случае, так это сохранял фактический URL-адрес, который вы хотите отобразить в базе данных. Не обязательно объект BLOB, фактические данные изображения, но URL-адрес. Хранение BLOB-объектов в БД делает их более транспортабельными, вы можете переместить БД на другую платформу и не беспокоиться о необходимости также перемещать изображения. Тем не менее я обычно храню URL-адрес.
Я никогда не делал никаких изображений, как вы описываете здесь,древовидную структуру с координатами X, Y. Не в веб-форме. Абсолютное позиционирование относительно других объектов в разных браузерах... вы когда-нибудь видели старый фильм под названием "денежная яма" ??

alexvw

Привет,

Судя по тому, что я вижу в комментарии Майка, описание вашего "сценария" может потребовать некоторого переписывания.

Пожалуйста, поправьте меня, если я ошибаюсь. Я полагаю, что вы не пытаетесь использовать уникальный ClientId каждого элемента управления изображением, чтобы связать его с целевым изображением, а скорее значение int Id, которое каким-то образом вы связали (или должны связать) с каждым элементом управления изображением.

Я бы предположил, что указанное значение int Id будет соответствовать имени его целевого файла изображения (intIdVal.svg/png), что, в свою очередь, облегчит создание необходимого URL-адреса для восстановления/поиска загружаемого файла. В этом случае изменение URL-адресов на основе "значения int определенной таблицы в базе данных" было бы просто вопросом повторного связывания этих значений int с каждым элементом управления изображением, а затем загрузки страницы (с новым набором изображений).

В сценарии рабочего стола я использовал свойство тега элемента управления для хранения данных такого рода, например ключа int Id. Но на веб-странице такого нет; возможно, вам придется придумать способ сделать это таким списком, массивом или другим подходящим контейнером, который, скорее всего, будет прикреплен к сеансу пользователя.

Надеюсь, это поможет; ура!

Kanomar

Прежде всего, спасибо за ваши ответы.
И Алекс, ты прав, я, может быть, увлекся и немного потерял фокус.

И как вы догадываетесь, я не хочу использовать уникальный идентификатор элемента управления изображением, мне просто нужно свойство, в котором я могу ввести 6-значный код, доступный из кода позади.

Я постараюсь улучшить свой вопрос.

С Уважением, Деннис

Richard Deeming

using (SqlCommand command = new SqlCommand("SELECT Id, SollIst ,Funktionsbyte, Stellcode FROM Stellzustand WHERE Id = '" + ID_property_of_image + "' and SollIst = 1 ", connection))


НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

using (SqlCommand command = new SqlCommand("SELECT Id, SollIst ,Funktionsbyte, Stellcode FROM Stellzustand WHERE Id = @Id and SollIst = 1", connection))
{
    command.Parameters.AddWithValue("@Id", ID_property_of_image);
    ...

1 Ответов

Рейтинг:
6

Kanomar

Ладно, я сделал это.

Я прячу нужный мне идентификатор внутри imageID, например "Image134567"

<pre> <asp:image id="FG4_137502" Tooltip="LED 5" runat="server"  Height="121px" Width="61px" style="position:absolute;top:750px; transform:rotate(90deg); left:600px; z-index:2"  />


Затем я вызываю все Imagecontrols из кода позади, подстрока первые 5 символов и получил свой идентификатор для базы данных, работать мой запрос, а затем установить imageurl на основе reslut этого запроса.

//nach allen Imagecontrols suchen und für alle die Imageurl setzen
private void ChangeImageUrls(Control ctrl)
{

    {
        using (SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=; USER ID=; Password=; Integrated Security=false"))
        {

            connection.Open();

            foreach (Control subCtrl in  ctrl.Controls)
            {

                if (subCtrl is Image)
                {
                    //ImagecontrolID auslesen
                    var Value = subCtrl.ID;

                    //ersten 4 Buchstaben der Imagecontrol ID abschneiden
                    string sub = Value.Substring(4);



                    SqlCommand command = new SqlCommand("select ID,Stellcode,Funktionsbyte from Stellzustand WHERE SollIst =1 AND Id=" + sub + "", connection);
                    SqlDataReader read = command.ExecuteReader();

                    while (read.Read())
                    {
                        DBID.DB_ID = (read["ID"].ToString());
                        DBSC.DB_SC = (read["Stellcode"].ToString());
                        DBFbyte.DB_Fbyte = (read["Funktionsbyte"].ToString());

                    }
                    //Ergebnis auswerten und Imageurl erzeugen
                    string result = DBID.DB_ID + "_" + DBFbyte.DB_Fbyte + "_" + DBSC.DB_SC + ".png";

                    read.Close();

                    //Hier wird die Imageurl gesetzt mit dem Ergebnis aus der Datenbank
                    ((Image)subCtrl).ImageUrl = "~/images/" + result + "";

                    if (subCtrl.HasControls())
                        ChangeImageUrls(subCtrl);

                    //TO DO: Liste(?) mit Ergebnissen erzeugen und das Ergebnis in einem großen Paket übertragen.
                }

            }

            //Datenbank Verbindung schliessen
            connection.Close();
        }



Если изображение находится внутри панели обновления, я могу получить их с помощью
UpdatePanel ctrlPanel = (UpdatePanel)ctrl;
foreach (Control subCtrl in ctrlPanel.Controls[0].Controls)


вместо:
foreach (Control subCtrl in  ctrl.Controls)


Спасибо всем, закрыто


Vincent Maverick Durano

Цитата:но я не могу заставить его работать, потому что, когда я помещаю изображение в панель обновления, мой код позади него больше не находит его.

Как вы назвали свой код?

В качестве альтернативы UpdatePanel вы можете написать AJAX-вызов для запуска серверного кода с (x) секундами. Просто сделайте быстрый поиск в google для примеров.

Richard Deeming

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

Если вы хотите задать новый вопрос, то задавать вопрос[^]

НЕ разместите вопрос как "решение" вашего вопроса.

Kanomar

Ладно, извини за это. Я уже нашел решение этого вопроса.

Благодарить всех.