C'è qualcosa di meglio di un StringBuilder per grandi blocchi di SQL nel codice

6

Sono solo stanco di fare una grande istruzione SQL, testarlo e quindi incollare l'SQL nel codice e aggiungere tutti sqlstmt.append(" all'inizio e ") alla fine.

È il 2011, non c'è un modo migliore per gestire una grande quantità di stringhe all'interno del codice?

Per favore: non suggerire procedure memorizzate o ORM.

modifica trovato la risposta utilizzando letterali XML e CData. Grazie a tutte le persone che hanno effettivamente cercato di rispondere alla domanda senza chiedermi di non usare ORM, SP e l'utilizzo di VB

modifica 2 la domanda mi lascia pensare che le lingue potrebbero cercare di fare uno sforzo migliore per l'uso di SQL in linea con la sintassi dei colori, ecc. Sarà meno costoso sviluppare Linq2SQL.

Solo qualcosa del tipo:

dim sql = <sql>
          SELECT * ...
          </sql>
    
posta Eduardo Molteni 22.06.2011 - 23:07
fonte

7 risposte

6

Stabbing nel buio VB.NET qui usando google - che è un coltello affilato malvagio, correttamente impugnato ...

dim sqlstmt = <s>Select *
    from dbo.SomeTable
    where SomeField = 1
    and AnotherField = 2</s>.Value

da link

Avvertenza: non ho provato personalmente questa sintassi. O anche leggere l'intero articolo.

    
risposta data 22.06.2011 - 23:56
fonte
5

Che ne dici di questo:

sqlstmt.append(@"SELECT *
                 FROM Contacts
                 WHERE LastName = 'Johnson'
                   AND ContactId > 42
                 ORDER BY FirstName");

La chiave è il simbolo @. Questa è la sintassi C #.

Secondo Confronto VB.NET e C # non esiste un tale operatore letterale stringa in vb.net.

    
risposta data 22.06.2011 - 23:18
fonte
5

Se utilizzi .NET / Visual Studio, gli strumenti per incorporare stringhe di grandi dimensioni in un'app sono in circolazione da molto tempo.

Vedere quanto segue: Aggiunta e modifica delle risorse .

Un tipo di risorsa che puoi aggiungere è un file di testo. Puoi inserire qualsiasi testo che desideri qui. È fantastico per le istruzioni SQL se per qualche motivo non è possibile utilizzare una stored procedure (sebbene i motivi di validi per tali limitazioni siano pochi e distanti tra loro).

Fai riferimento al contenuto di una risorsa file di testo nello stesso modo in cui fai riferimento a qualsiasi altra stringa:

sql = Resources.NameOfSqlQuery;

o in VB.NET:

sql = My.Resources.NameOfSqlQuery;

Questo è tutto.

Oh, e solo per la cronaca, se hai intenzione di farlo, per favore resisti alla tentazione di usare String.Format su di loro. Parametrali come faresti con qualsiasi altra istruzione SQL inline.

    
risposta data 22.06.2011 - 23:32
fonte
0

Se divertente, come fare una domanda mi costringe a trovare una risposta.

Non ho mai usato XML Literals perché non puoi usare <, > / e altri caratteri XML riservati, ma ho appena scoperto che puoi usare CDATA per evitare il problema!

 Dim sqlstmt = <s><![CDATA[                      
             SELECT *
             FROM Contacts
             WHERE LastName = {0}
               AND ContactId > {1}
             ORDER BY FirstName
          ]]></s>.Value

Grazie a tutti per il tuo tempo!

    
risposta data 22.06.2011 - 23:59
fonte
0

Ricordo uno strumento che usavo chiamato Paste-As .... Sembra che sia stato rimarchiato come SmartPaster , ma ti permette di incollare tutto ciò che è negli Appunti come StringBuilder (tra le altre cose)

    
risposta data 23.06.2011 - 01:15
fonte
0

Sono d'accordo con l'approccio che @aaronnaught usa ma con un leggero cambiamento. Crea un file con sql come estensione nel progetto e inserisci il testo della query. Quindi aggiungilo come risorsa (proprietà del progetto, scheda Risorse, Aggiungi risorsa, quindi cerca il file sql che hai creato) e fai riferimento in codice come My.Resources.Filename:

Dim cmd As New SqlClient.SqlCommand(My.Resources.Query)

Poiché si tratta di un file sql, puoi eseguire la query, vedere i risultati in VS e il testo è ben formattato.

    
risposta data 25.09.2015 - 04:54
fonte
-1

Quale linguaggio di programmazione?

In Java, non dovresti creare istruzioni SQL concatenando parti con StringBuilder . Utilizza invece PreparedStatement , dove inserisci ? punti interrogativi nell'SQL per i parametri e imposta i valori dei parametri utilizzando i vari metodi set...() di PreparedStatement .

Questo ti protegge dagli attacchi SQL injection. Quando si concatena insieme un'istruzione SQL che include i valori dei parametri manualmente, si dovrà anche sfuggire manualmente ai caratteri per impedire attacchi di SQL injection.

    
risposta data 22.06.2011 - 23:22
fonte

Leggi altre domande sui tag