---
title: "Problem med att ha flera likadana item i en listbox"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/169850-problem-med-att-ha-flera-likadana-item-i-en-listbox"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "saw"
published: "2008-03-12T12:37:43.000Z"
updated: "2008-03-18T14:06:04.000Z"
replies: 19
views: 1359
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/169850-problem-med-att-ha-flera-likadana-item-i-en-listbox"
---

# Problem med att ha flera likadana item i en listbox

## #1 — saw, 2008-03-12T12:37Z

Jag har två listboxar en med all tillgängl post samt den andra dit man kan
föra över ifrån den första.
Jag vill dock inte ha några dubbleter.
Detta sättet fungerade innan jag la till databasoperationer men inte nu
längre. Hur kan jag förbättra koden?   :stud 

```
itemText = ListBox1.SelectedItem.Text;
                ListItem lstitem = ListBox2.Items.FindByValue(itemText);
                if (lstitem != null)
                {
                    Label2.Text = "Tjänsten finn redan.";
                }

                else
                {
                    int anvId = Convert.ToInt32(ViewState["klientId"]);
                    sql = String.Format("INSERT INTO t_anstTjanst (anId,tjanst)
 VALUES ('{0}','{1}');", anvId, itemText);
                    Webbutill.executeSQL(sql, DBConn);
                    DBConn.Close();
                    sql = String.Format("SELECT id, tjanst FROM t_anstTjanst 
WHERE anId ={0};", anvId);
                    AccessDataSource4.SelectCommand = sql;
                    AccessDataSource4.DataBind();
                    ListBox2.Items.Add(itemText);
                    Label2.Text = "";
                }
```

Som det nu är så är det ingen hit..  :l

Permalänk: https://www.webforum.nu/p/169850

## #2 — saw, 2008-03-13T08:29Z

Så dumt, jag kom på det att om jag kolla i databasen först, så fick jag det att fungera
bra.

Permalänk: https://www.webforum.nu/p/2087880

## #3 — spango, 2008-03-13T09:13Z

Det ser ut som att din kod öppnar för SQL-injektion. Men så är det väl inte? :)

Permalänk: https://www.webforum.nu/p/2087882

## #4 — emission, 2008-03-13T10:20Z

Jag hoppas att du oftast har mer kontroll över SQL Injection än så där. Parametrisera allt.

Permalänk: https://www.webforum.nu/p/2087894

## #5 — saw, 2008-03-13T11:42Z

Jodå jag bygger in det med.
Jag gör så här:

```
 public static string fixaTecken(string strText)
    {
        string nText = string.Empty;
        nText = strText.Replace("_", "");
        nText = strText.Replace("´", "");
        nText = strText.Replace("|", "");
        nText = strText.Replace("@", "");
        nText = strText.Replace("$", "");
        nText = strText.Replace("'", "");
        return nText;
    }
```

Det skall väll räcka.

Permalänk: https://www.webforum.nu/p/2087917

## #6 — Josef, 2008-03-15T12:00Z

Snyggare att ha en kollektion med IDbDataParameter (har för mig att interfacet heter så) som en parameter till din ExecuteSQL.

Permalänk: https://www.webforum.nu/p/2091326

## #7 — saw, 2008-03-15T15:19Z

Det var just snyggt, jag som helt nyligen lärt mig att skriva mina sql:er så här...

Permalänk: https://www.webforum.nu/p/2091360

## #8 — spango, 2008-03-16T22:48Z

Att ta bort tecken är inte rätt väg att gå :) se istället till att det blir säkert att stoppa in valfritt tecken. Parametriserade frågor. Sök här på forumet.

Permalänk: https://www.webforum.nu/p/2091849

## #9 — saw, 2008-03-17T08:08Z

Är det så här du menar:
<http://www.webforum.nu/showthread.php?t=67425&highlight=IDbDataParameter>

Permalänk: https://www.webforum.nu/p/2091878

## #10 — spango, 2008-03-17T08:15Z

Japp, det är det vi menar.

Permalänk: https://www.webforum.nu/p/2091884

## #11 — saw, 2008-03-17T13:15Z

Då gär jag någonting galet, jag får inga fel, men jag får inga påster heller...

```
 sql = "SELECT id, forId, tjanst FROM t_forTjanst WHERE forId =? ORDER BY t_forTjanst.tjanst";
        OleDbCommand cmd = new OleDbCommand("", DBConn);
        cmd.CommandText = sql;

         OleDbParameter paramforId = new OleDbParameter("@forId", DbType.Int32);
        paramforId.Value = "idforId";
        cmd.Parameters.Add(paramforId);

        DBConn.Open();
        OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        while( dr.Read())
        {
            //ListBox1.Items.Add(new ListItem(ds.Tables[0].Rows[i]["tjanst"].ToString()));
            ListBox1.DataSource = dr;
            ListBox1.DataValueField = "id";
            ListBox1.DataTextField = "tjanst";
            ListBox1.DataBind();
        }
```

Var klantar jag mig?

Permalänk: https://www.webforum.nu/p/2091959

## #12 — inspiro, 2008-03-17T13:57Z

Du kan inte ha dr som datakälla i en while-loop, du kommer att skriva över tidigare rader hela tiden. Använd metoden add eller insert som du kommenterat bort, funkar inte det?

```
ListBox1.Items.Add(new ListItem(dr["tjanst"].ToString(), "value");
```

Permalänk: https://www.webforum.nu/p/2091965

## #13 — saw, 2008-03-17T17:18Z

Tack för att du försöker men jag får inte fram någon data i alla fall trots ditt fina försök.

Permalänk: https://www.webforum.nu/p/2092012

## #14 — emission, 2008-03-17T22:03Z

DataReadern är redan en listbar datasource. Du behöver ingen while-loop.

```
OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
ListBox1.DataSource = dr;
ListBox1.DataValueField = "id";
ListBox1.DataTextField = "tjanst";
ListBox1.DataBind();
dr.Close();
```

Permalänk: https://www.webforum.nu/p/2092089

## #15 — saw, 2008-03-17T22:18Z

Tack  emission även det har jag testat. Jag mistänker att felet är att forId (som 
frågetecknet skall leta upp) det kommer ifrån 

```
 DataTable dt = Webbutill.fillDataTable(DBConn, sql);
        if (dt.Rows.Count > 0)
        {
            DataRow row = dt.Rows[0];
            iId = Convert.ToInt32(row["Id"]);
```

.. ett annat resultat som jag får ut och jag tror att problemet är att jag
inte kan plocka ihop dom.

Permalänk: https://www.webforum.nu/p/2092096

## #16 — emission, 2008-03-18T00:33Z

I did kod ovan står:

```
paramforId.Value = "idforId";
```

Men menar du inte...

```
paramforId.Value = idforId;
```

...eller något sånt? Du vill ju inte att den söka efter poster där forId='idforId'

Dessutom, om du använder en annan databasfråga för att plocka detta värde så är det rimligt att du borde kunna slå ihop frågorna med en join, men du kanske använder DataTable:n till annat också?

Permalänk: https://www.webforum.nu/p/2092119

## #17 — saw, 2008-03-18T07:50Z

Nu fungerar det tack för att ni har varit tålbodiga med mig. Jag har dock inte
fattat varför jag skall göra på det här sättet. Är det säkrare, snabbare, 
stabilare eller?

För att jag skall förstå bättre, skall jag ha med alla fälten eller bara de som
är med i "WHERE"-satsen?
Vid en uppdate och insert så förstör jag att alla bör vara med, men hur blir
det då med "SQL-injektion" behöver jag inte köra med min replace-funktion?

Permalänk: https://www.webforum.nu/p/2092136

## #18 — saw, 2008-03-18T10:21Z

Tack vare att förra sql:en blev bra, så försöker jag på en ny, och misslyckas
naturligtvis. Jag får ingen data alls...

```
 string selListbox = ListBox1.SelectedItem.ToString();
        sql="SELECT t_anstPerson.Id, t_anstPerson.Namn, 
t_anstPerson.AnstNr, t_anstPerson.Tel, t_anstPerson.Mobil "+
        " FROM t_anstPerson  WHERE t_anstPerson.Namn=?";

        OleDbCommand cmd = new OleDbCommand("", DBConn);
        cmd.CommandText = sql;

        OleDbParameter paramforNamn = new OleDbParameter("@paramforNamn", DbType.Int32);
        paramforNamn.Value = selListbox;
        cmd.Parameters.Add(paramforNamn);

        DBConn.Open();
        
        OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        while (dr.Read())
        {
                LAnstNamn.Text = dr["Namn"].ToString(); 
        }
        dr.Close();
```

Är jag likväl på fel väg?

Permalänk: https://www.webforum.nu/p/2092158

## #19 — emission, 2008-03-18T10:25Z

> Är det säkrare, snabbare,
> stabilare eller?

Ja (MYCKET), ja (VARIERANDE) och ja (MYCKET).

> För att jag skall förstå bättre, skall jag ha med alla fälten eller bara de som
> är med i "WHERE"-satsen?

Alla värden som kommer "utifrån". Om en SQL-sats tidigare så ut så här:

```
string sql = "UPDATE tabell set kolumn=" + värde + " WHERE annankolumn=1 AND tredjekolumn=" + annatvärde
```

..så ska den nu se ut så här:

```
string sql = "UPDATE tabell set kolumn=? WHERE annankolumn=1 AND tredjekolumn=?"
```

> Vid en uppdate och insert så förstör jag att alla bör vara med, men hur blir
> det då med "SQL-injektion" behöver jag inte köra med min replace-funktion?

Du **ska** inte använda replace-funktionen. Det sköts automatiskt och du behöver inte bry dig om farliga tecken.

Permalänk: https://www.webforum.nu/p/2092161

## #20 — saw, 2008-03-18T14:06Z

Nu har jag fått det mesta att fungera och jag tror att jag förstår principen.
Tack för all fin hjälp jag har fått.

Permalänk: https://www.webforum.nu/p/2092184

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/169850-problem-med-att-ha-flera-likadana-item-i-en-listbox
