Avatar billede disco_keld Nybegynder
28. august 2003 - 09:41 Der er 50 kommentarer og
1 løsning

Count på Unikke IP Adresser i Db?

Hej med jer...

Jeg har lavet en tabel i min db, som logger count, hostAddress ovs. i global.asax metoden "Application BeginRequests".

Nu vil jeg gerne tælle hvor mange, unikke IP adresser der er blevet logget i db pr. dag.

Er der nogen forslag til noget SQL om det?

Mvh

DK
Avatar billede bennytordrup Nybegynder
28. august 2003 - 09:47 #1
select cast(convert(nvarchar(10), DateField, 112) as datetime) as TheDate, HostAddress, Count(*) as UniqueCount
from LogTabel
group by cast(convert(nvarchar(10), DateField, 112) as datetime), HostAddress
Avatar billede bennytordrup Nybegynder
28. august 2003 - 09:47 #2
Det skulle være et svar :-)
Avatar billede disco_keld Nybegynder
28. august 2003 - 09:49 #3
jeg fatter ikke lige helt hvordan dit eksempel hænger sammen

:-(

Er det count pr. dag?
Avatar billede bennytordrup Nybegynder
28. august 2003 - 09:57 #4
Det skulle være:

select cast(convert(nvarchar(10), DateField, 112) as datetime) as TheDate, Count(HostAddress) as UniqueIPCount
from LogTabel
group by cast(convert(nvarchar(10), DateField, 112) as datetime)
Avatar billede disco_keld Nybegynder
28. august 2003 - 09:58 #5
vil du ikke lige forklare lidt?

:-)
Avatar billede bennytordrup Nybegynder
28. august 2003 - 09:58 #6
Sorry:

select cast(convert(nvarchar(10), DateField, 112) as datetime) as TheDate, Count(distinct HostAddress) as UniqueIPCount
from LogTabel
group by cast(convert(nvarchar(10), DateField, 112) as datetime)
Avatar billede bennytordrup Nybegynder
28. august 2003 - 09:59 #7
det første felt i select er datoen renset for tid. andet felt er antal unikke hostaddress

Der grupperes for datoen renset for tid.

Dette vil give dit ønskede resultat
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:04 #8
min tabel ser således ud:

ID,
Log (bit),
HostAddress,
DateAdded
Avatar billede bennytordrup Nybegynder
28. august 2003 - 10:06 #9
select cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate, count(distinct HostAddress)
from LogTabel
group by cast(convert(nvarchar(10), DateAdded, 112) as datetime)
Avatar billede bennytordrup Nybegynder
28. august 2003 - 10:07 #10
Prøv den SQL af i query analyzer og sammenlign med faktiske data.
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:15 #11
Virker... i query analyzer

Men i min label viser den 0, hehe...
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:17 #12
Hvad sker der.... den viser 0 ?!?!?

Min count metode, skulle da være rigeligt til at vise det i en form

Dim Result As Integer = 0
                Result = CType(oCommand.ExecuteScalar(), Integer)

                Return Result
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:22 #13
hvad skal jeg gøre for at få det rigtige output?
Avatar billede bennytordrup Nybegynder
28. august 2003 - 10:32 #14
Du skal ikke bruge ExecuteScalar, da der returneres et dataset.

dim Result as Integer = 0
dim rs as SqlDataReader
rs = oCommand.ExecuteReader()
Result = CType(rs("DistinctCount"), Integer)
return Result


Dette kræver, at ændrer SQL til:

select cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate, count(distinct HostAddress) as DistinctCount
from LogTabel
group by cast(convert(nvarchar(10), DateAdded, 112) as datetime)
Avatar billede bennytordrup Nybegynder
28. august 2003 - 10:32 #15
den viste kode er ikke testet - skrevet OTOMH
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:47 #16
Invalid attempt to read when no data is present.

:-(
Avatar billede bennytordrup Nybegynder
28. august 2003 - 10:50 #17
Prøv at ændre din sql:

select count(distinct HostAddress), cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from LogTabel
group by cast(convert(nvarchar(10), DateAdded, 112) as datetime)

Din kode ændrer du til ExecuteScalar() indstillingen.

Ifølge MSDN returneres det første felt i den første række af ExecuteScalar().
Avatar billede disco_keld Nybegynder
28. august 2003 - 10:59 #18
output i Query Analyser virker som det skal, men output i browser er 1 uanset hvad...
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:04 #19
Prøv at poste hele koden.
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:04 #20
Public Function CountUniqueHostAddressPrDay() As String
            Dim oConnection As New SqlConnection(DB("Telelet"))
            Dim oCommand As New SqlCommand
            Dim Result As String
            Try
                oConnection.Open()
                With oCommand
                    .CommandText = "Test"
                    .CommandType = CommandType.StoredProcedure
                    .Connection = oConnection
                    Result = CType(.ExecuteScalar(), String)
                End With

                Return Result
            Catch ex As Exception
                LogErrorEvent(ex.ToString)
                Throw ex
            End Try
        End Function
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:06 #21
Og dit script til oprettelse af proceduren Test
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:09 #22
vent vent.... det virker!

Outputtet er rigtigt nu.

Den tæller dem alle, nu skal jeg bare have lavet en dropdownliste med dato.

Så når jeg vælger en dato, så skal den vise antal unikke hits.

Hvordan fylder man en dropliste hvor datoen kun står 1 gang?
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:11 #23
Du skal bruge en SQL:

select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from LogTabel
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)

Du kan evt. sætte desc efter cast-delen i order by.

Hvordan du fylder drop down listen er mere et spørgsmål til VB.NET gruppen.
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:12 #24
Er det ASP.Net, du arbejder i? Hvis så, så sørg for at bruge Ctrl-F5 til at genopfriske browser-vinduet, når du skal teste. F5 er ikke altid nok til at gennemtvinge ændringer i bagved liggende kode.
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:15 #25
Okay..

Tak for hjælpen.

Jeg ved nu godt hvordan man fylder en dropliste, men man kan jo ikke ligefrem lave en DISTICNT i SQL'en på de datoer pga der er klokkeslet bagved
28-08-2003 09:29:30

Så skal jeg fjerne tiden og smide den i et seperat felt eller hvad?

:-)
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:16 #26
hvad var den her til sagde du?

select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from LogTabel
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)

Du kan evt. sætte desc efter cast-delen i order by.???
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:17 #27
Brug den SQL, jeg smed i svaret af 28/08-2003 11:11:54. Den sørger for at rense dato-feltet for tidsinformation (returnerer datoen med tom tid (00:00:00.000))
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:17 #28
ja
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:29 #29
hvis jeg bruger den SQL Fra svaret af 28/08-2003 11:11:54

så får jeg følgende fejl: "Object reference not set to an instance of an object. "
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:30 #30
Den fejlmeddelelse er var VB.NET
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:30 #31
Du har en fejl i din VB.NET Kode.
Avatar billede disco_keld Nybegynder
28. august 2003 - 11:45 #32
den virker altså ikke den SQL der fra svaret af 28/08-2003 11:11:54...

Nu har jeg lavet min tabel så den indeholder et DateAdded og TimeAdded felter

Så i DateAdded ser dataene således ud: 09-09-2003

Så kan jeg lave en DISTINCT i min droplist SQL, men nu er outputtet kun 1???

:-(

Dammmmmmm
Avatar billede bennytordrup Nybegynder
28. august 2003 - 11:48 #33
Gider du køre den sql af 28/08-2003 11:11:54 i Query Analyzer og se på resultatet?
Avatar billede disco_keld Nybegynder
28. august 2003 - 12:08 #34
Til denne SQL:

select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from tblLog
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)

er outputtet i Analyzer datoene
Avatar billede bennytordrup Nybegynder
28. august 2003 - 12:20 #35
Så virker SQL'en også.

Problemet ligger i kommunikationen med VB.NET.
Avatar billede disco_keld Nybegynder
28. august 2003 - 12:23 #36
hmmmmm

min metode ser således ud:

Public Function CountUniqueHostAddressPrDay(ByVal day As String) As String
            Dim oConnection As New SqlConnection(DB("Telelet"))
            Dim oCommand As New SqlCommand
            Dim Result As String
            Try
                oConnection.Open()
                With oCommand
                    .CommandText = "Test"
                    .CommandType = CommandType.StoredProcedure
                    .Connection = oConnection
                    .Parameters.Add("@Day", day)
                    Result = CType(.ExecuteScalar(), String)
                End With

                Return Result
            Catch ex As Exception
                LogErrorEvent(ex.ToString)
                'StatusMail(ex.ToString)
                Throw ex
            Finally
                If Not oConnection Is Nothing Then
                    If oConnection.State <> ConnectionState.Closed Then
                        oConnection.Close()
                    End If
                    oConnection.Dispose()
                    oConnection = Nothing
                End If
            End Try
        End Function
Avatar billede disco_keld Nybegynder
28. august 2003 - 12:26 #37
den tager parametren day, som er den der bliver valgt fra droplisten...

og SQL ser sådan ud:

CREATE PROCEDURE dbo.Test
(@day varchar)
AS

select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from tblLog
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)
GO
Avatar billede disco_keld Nybegynder
28. august 2003 - 12:31 #38
hehe måske det hjælper med en WHERE Clause

CREATE PROCEDURE dbo.Test
(@day varchar)
AS

select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from tblLog
WHERE @day = DateAdded
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)
GO
Avatar billede disco_keld Nybegynder
28. august 2003 - 12:39 #39
Syntax error converting datetime from character string.
Avatar billede bennytordrup Nybegynder
28. august 2003 - 12:40 #40
Du roder nogle ting sammen.

Der er en procedure, som returnerer det unikke antal IP-adresser per dag. Den her et udseende.

Der er en procedure/sql script, som returnerer de unikke dage til brug i en drop-list. Den har et andet udseende:

Returnering af IP-count per dag med dato som parameter:

<SQL>
create procedure dbo.Test (@day datetime)
as
select count(distinct HostAddress)
from LogTabel
where cast(convert(nvarchar(10), DateAdded, 112) as datetime) = @day
</SQL>

Returnering af unikke datoer til drop-list (dataset)
<SQL>
create procedure dbo.TestDatoer
as
select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from tblLog
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)
</SQL>

droplisten skal du udfylde via den dbo.TestDatoer.

I din funktion CountUniqueHostAddressPrDay skal du bruge dbo.Test.

Desuden bør du sørge for at arbejde med DateTime variabler i stedet for strings.

Spørgsmålet her er, om SQL Statements virker. Hvordan du bruger det returnerede i VB.Net hører IMHO hjemme i den kategori.
Avatar billede bennytordrup Nybegynder
28. august 2003 - 13:21 #41
Kom du frem til noget?
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:39 #42
skulle lige have noget frokost... :-)

skal jeg lade være med at ændre i min tabel så og lade DateAdded være som den er?
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:44 #43
Returnering af unikke datoer til drop-list

DataBinder.Eval: 'System.Data.Common.DbDataRecord' does not contain a property with the name DateAdded.
Avatar billede bennytordrup Nybegynder
28. august 2003 - 13:46 #44
Omkring returnering af unikke datoer, så hedder datofeltet i det returnerede recordset også AddedDate
Avatar billede bennytordrup Nybegynder
28. august 2003 - 13:47 #45
Der er ingen grund til at have dato og tid splittet op i to forskellige felter.
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:47 #46
fejlen ligger her i så ikke:

create procedure dbo.TestDatoer
as
select distinct cast(convert(nvarchar(10), DateAdded, 112) as datetime) as AddedDate
from tblLog
order by cast(convert(nvarchar(10), DateAdded, 112) as datetime)

jeg binder mine data til listen således:

Dim obj As New Library.Util
            With ddlDays
                .DataSource = obj.FillDropListWithDays
                .DataTextField = "DateAdded"
                .DataValueField = "DateAdded"
                .DataBind()
            End With
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:48 #47
jeg har lavet det med dato og tid i samme felt igen...ligesom før.
Avatar billede bennytordrup Nybegynder
28. august 2003 - 13:49 #48
.DataTextField = "AddedDate"
.DataValueField = "AddedDate"
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:51 #49
det hjalp....... nu er der ihvertfald noget output

øv øv øv, men den tæller ikke korrekt i browseren.....

prøver lige i Q. Analyseren
Avatar billede disco_keld Nybegynder
28. august 2003 - 13:58 #50
det virker nu!!!!!

Mange mange tak for din tid Benny.

:-)

100 points for you.

Ha en fortsat god dag.

Mvh

DK
Avatar billede bennytordrup Nybegynder
28. august 2003 - 13:59 #51
I lige måde... Og tak for points.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester