Har en sida med en dropdown och en gridview där jag filtrerar posterna i gridview:en mha dropdownlistan. Några poster i databasen har tomma värden i det fält som visas i dropdownlistan vilket ger en tom rad längst upp i denna. Hur ska jag göra för att kunna välja denna tomma rad och därigenom visa dessa poster. Du bör (Skall) använda parameter frågor. Då din kod annars är sårbar för SQL-inject attacker. Tackar så hemskt mycket för svaret. Jag fick det att fungera med varianten SelectedValue.lengt > 0 dock inte om jag hade med parametrar i SELECT till GridView:en. Det gav samma resultat som förut, dvs att jag inte hittade några värden alls då dropdownlistvärdet var blank. Tack än en gång, man lär sig lite varje gång man är här. Så länge du är medveten om att din kod är sårbar för atttacker. Genom att lägga din applikation på en webserver kan du öppna öpp för attaker på servern och andra applikationer än din egen. Jag ska titta vidare på parametermöjligheterna men denna applikation körs bara internt med ett begränsat antal användare så jag tror inte risken för sql-injektioner är särskilt överhängande. Jag är emot tanken på att inte åtgärda en känt risk/säkerhetshål. Aj då, detta var illa. Jag kommer genast att intiera ett projekt som innebär att inga tomma fält får finnas i databasen med sluttid kl 22.00 i kväll. Därigenom kan frågan köras med parametrar och du får fullgod sömn och okar därför (förhoppningsvis) hjälpa mig med med framtida problem (vilka jag kan försäkra kommer att uppstå). Nu har jag lekt med en sida i Visual studio 2005. Har kommit fram till att det är jävligt svårt att skicka null till en parameter. Men en snabb lösning ser ut så här, desstuom behövs ingen jälvla kod:Hitta tomma värden från dropdownlista
<script>
Dim SQLString As String
Protected Sub sokKlinik(ByVal sender As Object, ByVal e As System.EventArgs)
SQLString = "SELECT * FROM [lakare] WHERE Klinik = '" & DropDownList2.SelectedValue & "'"
AccessDataSource1.SelectCommand = SQLString
Page.Focus()
End Sub
</script>
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="ADSklinik"
DataTextField="Klinik" DataValueField="Klinik" AutoPostBack="true"
OnSelectedIndexChanged="sokKlinik" >
</asp:DropDownList>
<asp:AccessDataSource ID="ADSklinik" runat="server" DataFile="lakarfort.mdb"
SelectCommand="SELECT DISTINCT Klinik FROM [lakare]"></asp:AccessDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID"
DataSourceID="AccessDataSource1" >
<Columns>
....
<asp:BoundField DataField="KLINIK" HeaderText="Klinik" SortExpression="KLINIK" >
<ItemStyle Wrap="False" />
</asp:BoundField>
....
</Columns>
</asp:GridView>
<!--DataSource Gridview -->
<asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="lakarfort.mdb"
SelectCommand="SELECT * FROM [lakare]">
<SelectParameters>
<asp:ControlParameter Name="Klinik" PropertyName="SelectedValue" ControlID="DropDownList2"
ConvertEmptyStringToNull="false" />
</SelectParameters>
</asp:AccessDataSource>
Anledningen till att jag använder en sub för att byta ut select-satsen är att jag har flera dropdownlistor som jag söker från.
Sv: Hitta tomma värden från dropdownlista
Din SQL fråga bör se ut något sånt här:
SELECT *
FROM [lakare]
WHERE (Klinik = @Klinik) OR ((Klinik IS Null) AND (@Klinik IS Null))
Sedan anger du värdet för parameter @Klinik.
Om du vill skriva dålig kod.
Jag vet inte vad DropDownList2.SelectedValue retunerar. Om även den retunerar null:
Protected Sub sokKlinik(ByVal sender As Object, ByVal e As System.EventArgs)
If DropDownList2.SelectedValue Is DBNull.Value Then
SQLString = "SELECT * FROM [lakare] WHERE Klinik = '" & DropDownList2.SelectedValue & "'"
Else
SQLString = "SELECT * FROM [lakare] WHERE Klinik IS Null"
End If
AccessDataSource1.SelectCommand = SQLString
Page.Focus()
End Sub
Annars om det är en tom sträng:
Protected Sub sokKlinik(ByVal sender As Object, ByVal e As System.EventArgs)
If DropDownList2.SelectedValue.length >0 Then
SQLString = "SELECT * FROM [lakare] WHERE Klinik = '" & DropDownList2.SelectedValue & "'"
Else
SQLString = "SELECT * FROM [lakare] WHERE Klinik IS Null"
End If
AccessDataSource1.SelectCommand = SQLString
Page.Focus()
End Sub
Semantiken: If satsen kontrollera om den är tom eller inte och väljer fråga där efter.
Sv: Hitta tomma värden från dropdownlista
Sv:Hitta tomma värden från dropdownlista
Om du kör din applikation på ett webbhotell kan du därmed din kod utgöra en risk för andra applikationer.
Så jag råder dig starkt att ta itur med SQL-inject sårbarheten i din kod.
Det är ditt ansvar som utvecklare!Sv: Hitta tomma värden från dropdownlista
Sv:Hitta tomma värden från dropdownlista
Jag kommer ligga ororlig om natten och drömma hemska mardrömmar om SQL-inject attacker tills dess att du åtgärdat detta. ;-)Sv: Hitta tomma värden från dropdownlista
Sv:Hitta tomma värden från dropdownlista
<asp:AccessDataSource
ID="ADSklinik"
runat="server"
DataFile="~/App_Data/lakarfort.mdb"
SelectCommand="SELECT DISTINCT Klinik
FROM [lakare]
WHERE Klinik IS NOT NULL"></asp:AccessDataSource>
<asp:DropDownList
ID="DropDownList2"
runat="server"
DataSourceID="ADSklinik"
DataTextField="Klinik"
DataValueField="Klinik"
AutoPostBack="true" AppendDataBoundItems="true">
<asp:ListItem Value="#alla#" Text="(Visa alla)"></asp:ListItem>
<asp:ListItem Value="#null#" Text="(Visa tomma)"></asp:ListItem></asp:DropDownList>
<asp:AccessDataSource
ID="AccessDataSource1"
runat="server"
DataFile="~/App_Data/lakarfort.mdb"
SelectCommand="PARAMETERS [@Klinik] Text ( 255 );
SELECT *
FROM [lakare]
WHERE ([@Klinik] = '#alla#') OR
([Klinik] IS NULL AND [@Klinik] = '#null#') OR
([Klinik] = [@Klinik])">
<SelectParameters>
<asp:ControlParameter
ControlID="DropDownList2"
DefaultValue=""
Name="Klinik"
PropertyName="SelectedValue"
Type="String" />
</SelectParameters>
</asp:AccessDataSource>
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="AccessDataSource1" >
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" SortExpression="ID" />
<asp:BoundField DataField="Förnamn" HeaderText="Förnamn" SortExpression="Förnamn" />
<asp:BoundField DataField="Efternamn" HeaderText="Efternamn" SortExpression="Efternamn" />
<asp:BoundField DataField="Klinik" HeaderText="Klinik" SortExpression="Klinik" />
</Columns>
</asp:GridView>
Jag antar att din databas ligger i samma katalog som din websidda. Detta innebär ett säkerhetsproblem. Hela databasen kan laddas ned. Det är därför det finns en App_Data mapp i vilket du kan lägga databasen.