Avatar billede mcnovy Nybegynder
14. januar 2007 - 15:45 Der er 19 kommentarer og
1 løsning

Dynamisk SQL, hvad gør jeg galt

Hej,

nu har jeg bixet med min SQL sætning en del tid,
og det er ligemeget hvad synes jeg snart, så vil det ikke som jeg vil....

min sætning ser således ud:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Artist_CodeConnectionString %>"
                          SelectCommand="DECLARE @SQL varchar(1000)
DECLARE @Artist_Temp varchar(1000)
SET @Artist_Temp = @Artist
SET @SQL = 'SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId  '

IF @Artist IS NOT NULL BEGIN
SET @SQL = @SQL + 'WHERE Artist.Artist = ' + (@Artist_Temp)
END


EXEC(@SQL)">
                    <SelectParameters>
                        <asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" DefaultValue=""
                            Name="Artist" PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Album"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Genre"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox4" ConvertEmptyStringToNull="False" Name="SongTitle"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox5" ConvertEmptyStringToNull="False" Name="strSQL"
                            PropertyName="Text" />
                    </SelectParameters>
                </asp:SqlDataSource>

den kommer med en fejl der hedder:

Incorrect syntax near '='.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near '='.

og hvis jeg har indhold i textbox1(@Artist)
så får jeg denne fejl:

Invalid column name 'Test'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'Test'.


Er der nogen der umidelbart kan se hvad jeg gør galt..?
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 15:54 #1
hvorfor ligger du ikke det der ind i en stored procedure.
Avatar billede mcnovy Nybegynder
14. januar 2007 - 15:57 #2
tjaa.
nu ville jeg lige lærer det ene, før jeg går igang med det næste.. :)
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 15:59 #3
Jeg tror ikke at det du forsøger kan lade sig gøre.
du kan lave din sql sætning sådan her:

SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist =COALESCE(@Artist,Artist.Artist)
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 16:00 #4
du skal bare sætte
ConvertEmptyStringToNull="True" på dine controlparametre.
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:03 #5
Ideen idet det her er at jeg har 4 textboxe at skal søge mellem,

og hvis der kun er indhold i 2 af dem, så skal den kun bruge de 2 i min WHERE streng.

Jeg har godt læst om den der COALESCE før, er det ikke noget med at den tager det første IKKE NULL object..?

men det ville (tror jeg ihvertfald ikke) kunne fungere når jeg nu har 4 textboxe, og det skal fungere på den måde at de textboxe som er skrevet i skal "AND" med hinanden..!
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:08 #6
du skal bare sætte
ConvertEmptyStringToNull="True" på dine controlparametre.

Det får det ikke til at virke hos mig..!
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 16:09 #7
COALESCE tager null:
SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist =COALESCE(NULL,Artist.Artist)

Vil give dig den fulde liste.
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:22 #8
ok.. prøver lige at skrive den som jeg det færdige resultat skulle se ud som..

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Artist_CodeConnectionString %>"
                          SelectCommand="DECLARE @SQL varchar(1000)
SET @Artist_Temp = @Artist
SET @SQL = 'SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId  '

IF @Artist IS NOT NULL OR @Album IS NOT NULL
OR @Genre IS NOT NULL OR @SongTitle IS NOT NULL BEGIN
SET @SQL = @SQL + 'WHERE '
END
IF @Artist IS NOT NULL
BEGIN
SET @SQL = @SQL + 'Artist.Artist = ' + @Artist +' '
END
IF @Album IS NOT NULL
BEGIN
SET @SQL = @SQL + 'Album.Album = ' + @Album + ' '
IF @Genre IS NOT NULL
BEGIN
SET @SQL = @SQL + 'Genre.Genre = ' + @Genre + ' '
END
IF @SongTitle IS NOT NULL
BEGIN
SET @SQL = @SQL + 'Song.SongTitle = ' + @SongTitle + ' '
END

EXEC(@SQL)">
                    <SelectParameters>
                        <asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="False" DefaultValue=""
                            Name="Artist" PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Album"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Genre"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox4" ConvertEmptyStringToNull="False" Name="SongTitle"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox5" ConvertEmptyStringToNull="False" Name="strSQL"
                            PropertyName="Text" />
                    </SelectParameters>
                </asp:SqlDataSource>



det må være noget lignende det, som strengen skal være..
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 16:28 #9
nope mit foreslag er noget mere simpelt:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Artist_CodeConnectionString %>"
                          SelectCommand="SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist =COALESCE(@Artist,Artist.Artist) AND Album.Album =COALESCE(@Album ,Album.Album) AND Genre.Genre =COALESCE(@Genre,Genre.Genre) AND Song.SongTitle =COALESCE(@SongTitle ,Song.SongTitle)">
                    <SelectParameters>
                        <asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="True"
                            Name="Artist" PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Album"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox2" ConvertEmptyStringToNull="False" Name="Genre"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox4" ConvertEmptyStringToNull="False" Name="SongTitle"
                            PropertyName="Text" />
                        <asp:ControlParameter ControlID="TextBox5" ConvertEmptyStringToNull="False" Name="strSQL"
                            PropertyName="Text" />
                    </SelectParameters>
                </asp:SqlDataSource>
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:30 #10
på din kode fik jeg denne fejl:

The data types ntext and ntext are incompatible in the equal to operator.
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 16:34 #11
Problemet er de felt typer du har valgt.
Har du behov for at der kan stå mere end 8000 tegn i nogen af felterne ?
Hvis ikke så lav dem om til varchar.

ellers skal du bruge like:


SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist LIKE COALESCE(@Artist,Artist.Artist) AND Album.Album LIKE COALESCE(@Album ,Album.Album) AND Genre.Genre LIKE COALESCE(@Genre,Genre.Genre) AND Song.SongTitle LIKE COALESCE(@SongTitle ,Song.SongTitle)
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:44 #12
Hmm.. denne gang får jeg ingen fejl...

men jeg får heller ingen resultater... :)
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 16:47 #13
får du resultater med bare:
SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId
Avatar billede mcnovy Nybegynder
14. januar 2007 - 16:54 #14
ja...

jeg får også resultater hvis jeg laver "AND" om til OR
men så får jeg bare ikke det resultat jeg ønsker..!


ville det her være bedre at lave med en stored procedure..?
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 17:05 #15
du skal bruge samme sql.
Prøv lige med:
SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist LIKE COALESCE(@Artist+'%',Artist.Artist) AND Album.Album LIKE COALESCE(@Album+'%' ,Album.Album) AND Genre.Genre LIKE COALESCE(@Genre+'%',Genre.Genre) AND Song.SongTitle LIKE COALESCE(@SongTitle+'%' ,Song.SongTitle)
Avatar billede mcnovy Nybegynder
14. januar 2007 - 17:44 #16
ok.. den virker godt..

bortset fra Album.. den virker slet ikke..!

hvis den er tom, så virker den, men skriver jeg noget.. så får jeg intet tilbage..!
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 17:48 #17
prøv med:
SELECT Artist.Artist, Album.Album, Genre.Genre, Song.SongTitle, Song.Rating, Song.Counter, Song.SongId FROM Album INNER JOIN Song ON Album.AlbumId = Song.AlbumID INNER JOIN Artist ON Song.ArtistID = Artist.Artistid INNER JOIN Genre ON Song.GenreID = Genre.GenreId WHERE Artist.Artist LIKE COALESCE('%'+@Artist+'%',Artist.Artist) AND Album.Album LIKE COALESCE('%'+@Album+'%' ,Album.Album) AND Genre.Genre LIKE COALESCE('%'+@Genre+'%',Genre.Genre) AND Song.SongTitle LIKE COALESCE('%'+@SongTitle+'%' ,Song.SongTitle)
Avatar billede mcnovy Nybegynder
14. januar 2007 - 18:10 #18
hehe.. der var en fejl i controlparametrene for @Album...

nu virker det som det skal...
så smid et svar.. det har du fortjent.. :)

har du forresten et link til noget om COALESCE, det er da noget der virkelig funker..!

tak for hjælpen
Avatar billede dr_chaos Nybegynder
14. januar 2007 - 18:29 #19
Avatar billede mcnovy Nybegynder
14. januar 2007 - 18:34 #20
Takker
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