SelectCommand with Parameters biedt leeg resultaat

Op dit moment zal ik mijn code een beetje opschonen en VS vertelde me dat het beter is om de SqlParameter te gebruiken voor de sql-opdrachten in plaats van een samengestelde string . Dus besloot ik mijn code te veranderen, helaas krijg ik nu geen resultaat en ik weet niet waarom. Hier is het stukje van mijn code:

...    
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetSQLConnectionString());
SqlDataAdapter sqlSelect = new SqlDataAdapter();
try
{
    connection.Open();
    sqlSelect.SelectCommand = connection.CreateCommand();
    sqlSelect.SelectCommand.CommandText = "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@FROM", this.from));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@TO", this.to));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "'%" + this.SearchField.Text + "%'"));

    sqlSelect.Fill(dt);
    connection.Close();
}
catch(SqlException e)
...

Ik krijg geen uitzondering. Waarom is dt leeg na het zoeken? (Met een samengestelde tekenreeks werkt de select.) Wat ging er fout?

Greetz

2
u kunt de kolomnaam niet als parameter doorgeven
toegevoegd de auteur Lucas_Santos, de bron
voeg uw samengestelde reeks toe die werkte
toegevoegd de auteur Reniuz, de bron
De manier van SqlParameter is veel schoner, dat vind ik leuk. Het zou interessant zijn waarom mijn code niet werkt. @Lucas_Santos Ik veranderde het in de kolomnaam, maar dt is nog steeds leeg. Greetz
toegevoegd de auteur hofmeister, de bron

3 antwoord

U kunt veldnamen niet opgeven met behulp van dergelijke parameters. In jouw where-component WAAR @FROM LIKE @SEARCHSTRING vergelijkt het de waarde van de parameter @FROM met de waarde van de parameter @SEARCHSTRING .

Als de where-component evalueert naar true, krijgt u elke record in de woordenboektabel, als deze evalueert tot false krijgt u geen records. Het behandelt de inhoud van @from nooit als een veldnaam in de woordenboektabel.

2
toegevoegd
Ja, als ze hetzelfde zijn, krijg je de hele tafel. Je zult je Sql-string dynamisch moeten bouwen als je parameters wilt gebruiken om veldnamen te specificeren. De veiligste manier om dit te doen is door spExecuteSql te gebruiken msdn.microsoft.com/en- ons/bibliotheek/ms188001.aspx
toegevoegd de auteur Ben Robinson, de bron
Oké, ik heb het getest en je hebt gelijk! Het probleem is eigenlijk de Where-component. (Parameters op de kolompositie werken prima). Voor een beter begrip, de WHERE @ FROM LIKE @SEARCHSTRING vergelijken beide waarden, als ze hetzelfde zijn, krijg ik de volledige tabel, toch? Is het mogelijk om een ​​parameter toe te voegen aan @FROM , of moet ik de string CommandText op die positie samenvoegen? Bedankt, greetz.
toegevoegd de auteur hofmeister, de bron

Zoals mensen hier hebben gezegd, is het probleem dat je veldnamen niet als parameters kunt doorgeven.

De aanpak die u volgt, is om een ​​paar redenen een slecht idee, ten eerste wanneer u een sql-opdracht op deze manier doorgeeft, moet de server deze telkens opnieuw compileren elke keer dat u die query uitvoert, dit belast de server extra en vertraagt ​​de prestaties. Ten tweede is het een risico voor de veiligheid om uw geselecteerde uitspraken op deze manier door te geven, omdat het iedereen die het onderschept een blik op uw tabelstructuur geeft. Ten derde betekent het gebruik van selecte uitspraken als deze dat je de code die je niet aankruist opnieuw wilt gebruiken zonder een copy-paste.

Wat ik zou aanraden is om over te schakelen naar een opgeslagen procedure. je kunt nog steeds je parameters etc doorgeven, maar het zal je code verbeteren als het de SQL uit de C# haalt en alleen datgene achterlaat wat relevant is.

Als u WERKELIJK in veldnamen moet doorgeven voor gebruik binnen de geselecteerde instructie als deze, kunt u dit in SQL doen en een queryreeks opbouwen en deze vervolgens uitvoeren met sp_executesql.

In principe is wat je doet een zoekopdrachtsteken zoals

DECLARE @queryString VARCHAR(3000)

SET @queryString ='SELECT id, '[email protected]+' AS from, '[email protected]+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'[email protected]+'%'

gebruik dan gewoon sp_executesql om de @queryString uit te voeren

Mogelijk moet je de parameters als Varchar casten als je fouten krijgt tijdens het opbouwen van de querystring

1
toegevoegd
@Taz Ik heb het voorbeeld dat ik heb gepost bijgewerkt om de querystring te laten zien met het%
toegevoegd de auteur Purplegoldfish, de bron
@Taz bekijk dit, het is vrij eenvoudig, maar het laat zien hoe dit een beetje kan worden uitgebreid pastebin.com/tZqQpzmW
toegevoegd de auteur Purplegoldfish, de bron
@taz Wanneer u een tekenreeks selecteert, voert u gewoonlijk kolom = 'stringtext' uit, maar wanneer u de variabelen gebruikt, ziet de reeks die u maakt eruit als kolom = stringtext zonder het '' wat u moet doen is ervoor zorgen dat deze tekens worden opgenomen in de parameter die u doorgeeft aan de server
toegevoegd de auteur Purplegoldfish, de bron
Ja, ik moet echt de veldnamen doorgeven. De eindgebruiker kan veranderen met een dropdown-lijst van de geselecteerde kolom (ik wist dat het niet veilig is, maar ik weet het niet op een andere manier). Als ik je goed begrijp is het beter om een ​​procedure aan te maken, bij de procedure de dynamische velden toe te voegen en de parameters toe te voegen, zoals hier in c #. Ook voor sql-updates, verwijderingen enzovoort? Greetz
toegevoegd de auteur hofmeister, de bron
Oké, ik heb een procedure toegevoegd zoals je zei. Nu heb ik het probleem dat ik '% and%' aan de zoekreeks moet toevoegen. In de C# -code is dat geen probleem en alles werkt goed, maar hoe kan ik een enkel aanhalingsteken toevoegen als ik de procedure vanaf deSQL-serveruitvoer? In C# I do: cmd.Parameters ["@ SEARCHSTRING"]. Value = "'% string%'"; . Op deSQL-serverheb ik exec test_procedure @FROM = 'FROMVALUE', @TO = 'TOVALUE', @SEARCHSTRING = 'STRING' uitgevoerd. Greetz
toegevoegd de auteur hofmeister, de bron
Wel, dat werkt, maar als ik probeer te selecteren met gelijk ( = ), ontbreken de enkele aanhalingstekens, als de kolom bijvoorbeeld een varchar is. Ik zou interessant zijn om te weten, hoe ik een procedure zou kunnen uitvoeren die een steek op de sqlserver verwacht. Het werkelijke probleem is opgelost. Greetz
toegevoegd de auteur hofmeister, de bron
Mhm, om misverstanden te voorkomen, werkt de procedure correct. Ik zou graag willen weten, hoe ik een procedure van deSQL-serverzou kunnen uitvoeren, als een parameter een string is. Als ik bijvoorbeeld het volgende uitvoer: Procedure_Name @ FROM = coumn1, @ TO = coumn2, @ SEARCHSTRING = SEARCHSTRING , vertelt deSQL-serverme dat SEARCHSTRING geen kolom is, dat is correct. De juiste syntaxis voor zoeken is ['SEARCHSTRING'] . Bedankt iedereen! Greetz.
toegevoegd de auteur hofmeister, de bron

Waarom heb je een zoekopdracht als deze geschreven?

   "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";

je probeert @ FROM uit de tabel te halen en probeert het ook als een parameter door te geven, hoe zou dat moeten werken? Waarom heb je ook schuine strepen opgenomen? ze maken dingen gewoon rommelig, verwijderen ze. Een Select-query neemt invoerparameters alleen met de "WHERE" -clausule en nergens anders.

Probeer het hiermee te vervangen

"SELECT id, FROM AS 'from', TO AS 'to' FROM Dictionary WHERE FROM LIKE @SEARCHSTRING";

Verwijder ook alle, behalve de laatste keer dat:

sqlSelect.SelectCommand.Parameters.Add

Zorg er ook voor dat "FROM" ook een SQL-sleutelwoord is, dus zorg ervoor dat het op de juiste manier wordt geïnterpreteerd door het in "[]" te plaatsen.

Ik hoop dat dit helpt...

0
toegevoegd