[Alg] Query parameters dynamisch gebruiken

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik ben momenteel bezig met applicatie waar een database achter zit. Nu moet de gebruiker ook een mogelijkheid hebben om vanuit de applicatie query's uit te kunnen voeren op deze database. Het gaat om voorgedefineerde query's welke via de GUI uit te voeren zijn. Deze query's hebben parameters zodat de gebruiker criteria kan opgeven, voorbeeld:
code:
1
SELECT * FROM "Table" WHERE "Column1" = :Criteria1 AND "Column2" = :Criteria2

De parameters komen in de GUI in een invul lijstje waar de gebruiker de parameters kan vullen. Echter wil ik de gebruiker ook de mogelijkheid geven bepaalde criteria niet in te hoeven vullen. Dus dat hij bijvoorbeeld alleen Criteria2 opgeeft. De query wordt dan:
code:
1
SELECT * FROM "Table" WHERE "Column2" = :Criteria2


De gebruiker krijgt uiteraard niet de SQL te zien maar alleen de in te vullen parameters in een mooi lijstje.

Hoe zorg ik ervoor dat de query dynamisch kan worden aangepast (parameter verwijderen/toevoegen) en toch uitvoerbaar blijft? Ik zat te denken aan een SQL parser welke de SQL omzet in een tree, maar dit is nogal veel werk.

Ik maak gebruik van Delphi (BDS2006).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je WHERE clausule gewoon dynamisch opbouwen adhv de ingevulde UI controls ?

code:
1
2
3
4
5
6
7
string whereClause = "WHERE 1 = 1";

if( txtNaam.Text != string.Empty )
{
   whereClause += " AND naam = :p_naam";
}
...

:?

https://fgheysels.github.io/


  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Gewoon een kwestie van String manipulatie denk ik (zelfde als wat Whoami zegt).

Zelf laatst voor een project dynamisch een Create Table query laten genereren, waarbij kolommen bepaald werden op basis van een configuratiebestand. Zoiets had ik:

SQL:
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
MySqlQuery = "CREATE TABLE " & DestinationTable & " ([ID] [int] IDENTITY (1, 1) NOT NULL, "

For Each Column As Object In Columns
    ColumnIndex = Column(0) 'gebruiken we momenteel niet ...
    ColumnName = Column(1)
    ColumnType = Column(2)
    ColumnLength = Column(3)

    Select Case ColumnType
        Case "varchar"
            MySqlQuery &= String.Format("[{0}] [{1}] ({2}) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, ", ColumnName, ColumnType, ColumnLength)
        Case "bit"
            MySqlQuery &= String.Format("[{0}] [{1}] NULL, ", ColumnName, ColumnType)
        Case "decimal"
            MySqlQuery &= String.Format("[{0}] [{1}] ({2}, 0) NULL, ", ColumnName, ColumnType, ColumnLength)
        Case "float"
            MySqlQuery &= String.Format("[{0}] [{1}] NULL, ", ColumnName, ColumnType)
        Case "int"
            MySqlQuery &= String.Format("[{0}] [{1}] NULL, ", ColumnName, ColumnType)
        Case "datetime"
            MySqlQuery &= String.Format("[{0}] [{1}] NULL, ", ColumnName, ColumnType)
    End Select
Next

MySqlQuery &= String.Format("CONSTRAINT {0}_PK PRIMARY KEY (ID), ", DestinationTable)
MySqlQuery = MySqlQuery.Remove(MySqlQuery.Length - 2, 2) & ") ON [PRIMARY]"
WriteTrace(MySqlQuery, False)

[ Voor 13% gewijzigd door MacWolf op 29-03-2007 14:40 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Dat is inderdaad de makkelijkste oplossing, ik zat moeilijk te denken. Bedankt!

"The shell stopped unexpectedly and Explorer.exe was restarted."