Avatar billede eromaster Nybegynder
17. oktober 2011 - 12:11 Der er 5 kommentarer og
1 løsning

ASP.NET SQL insert fejl

Jeg har endelig besluttet mig for at konvertere fra ASP Classic til .net og det er jo noget af en omvæltning. Så forvent en del spørgsmål fra mig og jeg siger selvfølgelig påhånd tak for hjælpen :)

Nå, til selve spørgsmålet. Jeg er igang med at lære at lave SQL insert, update og delete. Jeg har fundet ud af at ligge min SQL connection i web.config.

Igår fik jeg endelig hul på det med SQL insert og det virkede perfekt, men her til morgen virker det sjovt nok ikke.

Koden:
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Net.Mail
Imports System.Data

Partial Class _Default
    Inherits System.Web.UI.Page

    Dim con As SqlConnection
    Dim sSQL As String
    Dim cmd As New SqlCommand(sSQL, con)
    Dim randomKey As String = Replace(System.Guid.NewGuid().ToString(), "-", "")

Protected Sub CreateUser_Click(sender As Object, e As System.EventArgs) Handles CreateUser.Click
        con = New SqlConnection(ConfigurationManager.ConnectionStrings("dbConnection").ConnectionString)
        con.Open()

        sSQL = "INSERT INTO UserTBL (Name,Email,Username,Password,Gender,Country,Bday,Enable,Authed,AuthKey)" & _
            " VALUES (@Name,@Email,@Username,@Password,@Gender,@Country,@Bday,@Enable,@Authed,@AuthKey)"

        cmd.Parameters.Add(New SqlParameter("@Name", Name.Text))
        cmd.Parameters.Add(New SqlParameter("@Email", Email.Text))
        cmd.Parameters.Add(New SqlParameter("@Username", Username.Text))
        cmd.Parameters.Add(New SqlParameter("@Password", Password.Text))
        cmd.Parameters.Add(New SqlParameter("@Gender", Gender.Text))
        cmd.Parameters.Add(New SqlParameter("@Country", Country.Text))
        cmd.Parameters.Add(New SqlParameter("@Bday", Bday.Text & "-" & Bmonth.Text & "-" & Byear.Text))
        cmd.Parameters.Add(New SqlParameter("@Enable", "0"))
        cmd.Parameters.Add(New SqlParameter("@Authed", "0"))
        cmd.Parameters.Add(New SqlParameter("@AuthKey", randomKey))

        cmd.ExecuteNonQuery()
        con.Close()
End Sub
End Class


Fejl:
Server Error in '/' Application.
ExecuteNonQuery: Connection property has not been initialized.
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.InvalidOperationException: ExecuteNonQuery: Connection property has not been initialized.

Source Error:

Line 54:        cmd.Parameters.Add(New SqlParameter("@AuthKey", randomKey))
Line 55:
Line 56:        cmd.ExecuteNonQuery()
Line 57:        con.Close()
Line 58:


Source File: C:\Data\dev.urbanswapping.com\Default.aspx.vb    Line: 56
Avatar billede jokkejensen Novice
17. oktober 2011 - 12:51 #1
før du executer, tror jeg du skal fortælle dit cmd, at :

dataCommand.Connection = con;

Du åbner og lukker den bare..

Best practice er dog at gøre noget ala:

string connectionString = "..."

using (SqlConnection dataConnection = new SqlConnection(connectionString))
{
    using (SqlCommand dataCommand = dataConnection.CreateCommand())
    {
        dataCommand.CommandText = ".."
        //Parameters
        dataConnection.Open();
        dataCommand.ExecuteNonQuery();
        dataConnection.Close();
    }
}


/J
Avatar billede softspot Forsker
17. oktober 2011 - 13:27 #2
Du skal umiddelbart have flyttet dine erklæringer af variable ind i click event-handleren, således:

Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Net.Mail
Imports System.Data

Partial Class _Default
    Inherits System.Web.UI.Page

Protected Sub CreateUser_Click(sender As Object, e As System.EventArgs) Handles CreateUser.Click
    Dim con As SqlConnection
    Dim sSQL As String



    con = New SqlConnection(ConfigurationManager.ConnectionStrings("dbConnection").ConnectionString)
    con.Open()

    sSQL = "INSERT INTO UserTBL (Name,Email,Username,Password,Gender,Country,Bday,Enable,Authed,AuthKey)" & _
            " VALUES (@Name,@Email,@Username,@Password,@Gender,@Country,@Bday,@Enable,@Authed,@AuthKey)"

    Dim cmd As New SqlCommand(sSQL, con)
    Dim randomKey As String = Replace(System.Guid.NewGuid().ToString(), "-", "")


    cmd.Parameters.Add(New SqlParameter("@Name", Name.Text))
    cmd.Parameters.Add(New SqlParameter("@Email", Email.Text))
    cmd.Parameters.Add(New SqlParameter("@Username", Username.Text))
    cmd.Parameters.Add(New SqlParameter("@Password", Password.Text))
    cmd.Parameters.Add(New SqlParameter("@Gender", Gender.Text))
    cmd.Parameters.Add(New SqlParameter("@Country", Country.Text))
    cmd.Parameters.Add(New SqlParameter("@Bday", Bday.Text & "-" & Bmonth.Text & "-" & Byear.Text))
    cmd.Parameters.Add(New SqlParameter("@Enable", "0"))
    cmd.Parameters.Add(New SqlParameter("@Authed", "0"))
    cmd.Parameters.Add(New SqlParameter("@AuthKey", randomKey))

    cmd.ExecuteNonQuery()
    con.Close()
End Sub
End Class

Når det så er sagt, bør du slet ikke lægge databaselogik i en event-handler, men derimod i et databsaelag.

Jeg er klar over at du er i en læringsprocess, så derfor skal dette opfattes som et råd til dit næste fokusområde... .-)
Du bør overveje at kigge lidt på objektorientering og mulighederne for at pakke dine data og handlinger ind og adskille dem vha. objekter. Jeg har selv arbejdet med ASP i 10 år, så jeg ved godt, at det ikke er det mest oplagte at kode på den måde heri (bla. pga. det include-helvede man typisk kommer til at stå i, men også fordi objektorientering ikke er fuldt implementeret i ASP - der mangler arv). Dette er ikke et problem i .NET og det faktum bør derfor udnyttes til fulde :-)
Avatar billede eromaster Nybegynder
17. oktober 2011 - 14:03 #3
softspot:

Det virkede perfekt. Smidt lidt et svar så jeg kan give dig point.
Der er så meget jeg skal lære pt. og jeg har valgt at kode i .net vb, hvilket måske ikke er det klogeste.

Har du evt. et link til en tutorial vedr. den databasestruktur og håndtering som du nævner?
Avatar billede softspot Forsker
17. oktober 2011 - 14:25 #4
Jeg tror ikke der er den store forskel på om du vælger VB eller C#, når det kommer til hvad du kan i .NET (du kan endda kombinere dem - dog i forskellige projekter - hvis du ønsker dette). Hvis du kommer fra VBScript giver det nok fin mening at vælge VB.NET (selvom der er stor forskel på disse to sprog!).

Jeg har ikke nogle konkrete links på hånden, men du kan søge efter repository pattern for at finde materiale om dette. Du kan nok også finde noget her på eksperten om emnet.

Umiddelbart mener jeg dog ikke dette er din første udfordring, hvis du er helt "blank" hvad angår .NET. Det er helt fint at eksperimentere med de grundliggende elementer, så som dataaccess og event-håndtering i webforms et stykke tid, inden du kaster dig over best practices indenfor arkitektur og objektorientering.
Avatar billede softspot Forsker
17. oktober 2011 - 14:25 #5
Ups! og et lille svar :-)
Avatar billede arne_v Ekspert
31. oktober 2011 - 00:35 #6
Bemaerk at man godt kan builde C# kode og VB.NET til en assembly, hvis man bruger et scriptet build. Restriktionen er kun i Visual Studio.
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
Kurser inden for grundlæggende programmering

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