Toon posts:

[vb.net] SqlCommand Insert

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een aantal variabelen in de applicatie aangemaakt die een waarde bevatten. Ik heb een database aangemaakt (SQL Express 2005) met een tabel Account. Deze tabel heeft een column Ticket (int; not null) en Ticketdate (datetime; not null). Mijn doel is om de variabelen m_ticket en m_ticketdate te schrijven naar de database. Het probleem is echter dat de commandtext als string moet worden opgegeven. Hoe moet ik dit aanpakken als ik m_ticket (int) en m_ticketdate (datetime) naar respectievelijk Ticket (int) en Ticketdate (datetime) in de database wil schrijven?

De code is bedoeld als illustratie.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Imports System.Data.SqlClient

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim con As SqlConnection = New SqlConnection
        con.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and Settings\Jan\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\data.mdf';Integrated Security=True;User Instance=True"

        Dim m_ticket As Integer = 1231213413
        Dim m_ticketdate As DateTime = #1/1/1000#
        Dim cmdinsert As String
        cmdinsert = "insert into Account (Ticket, Ticketdate) values (m_ticket, m_ticketdate)"

        con.Open()

        Dim cmd As New SqlCommand(cmdinsert, con)
        cmd.ExecuteNonQuery()

        con.Close()

    End Sub
End Class

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
PARA-METERS
:P

Daar is echt wel al duizend keer over geschreven zoals je kan zien (en ook in andere topics op got)

[ Voor 14% gewijzigd door whoami op 21-04-2007 14:31 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het gebruiken van parameters werkt goed, behalve als ik een value Nothing probeer te updaten.

Visual Basic .NET:
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
28
29
30
31
32
33
34
Imports System.Data.SqlClient

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim con As SqlConnection = New SqlConnection
        con.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Documents and Settings\Jan\My Documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\data.mdf';Integrated Security=True;User Instance=True"

        Dim m_ticket As Nullable(Of Integer) = Nothing
        Dim m_ticketdate As Nullable(Of DateTime) = #1/1/2000#
        Dim cmdinsert As String
        cmdinsert = "insert into Account (Ticket, Ticketdate) values (@p_ticket, @p_ticketdate)"

        Dim cmd As New SqlCommand(cmdinsert, con)

        Dim TicketParameter As SqlParameter = New SqlParameter("@p_ticket", SqlDbType.Int)
        TicketParameter.IsNullable = True
        TicketParameter.Value = m_ticket
        cmd.Parameters.Add(TicketParameter)

        Dim TicketDateParameter As SqlParameter = New SqlParameter("@p_ticketdate", SqlDbType.DateTime)
        TicketDateParameter.IsNullable = True
        TicketDateParameter.Value = m_ticketdate
        cmd.Parameters.Add(TicketDateParameter)

        con.Open()

        cmd.ExecuteNonQuery()

        con.Close()

    End Sub
End Class


In dat geval krijg ik bij de ExecuteNonQuery() een unhandled SQLexception:

Parameterized Query '(@p_ticket int,@p_ticketdate datetime)insert into Account (Ticke' expects parameter @p_ticket, which was not supplied.

De SQL database is gedefinieerd als:

TicketID int not nullable (identity specification aan)
Ticket int nullable
TicketDate DateTime nullable

Als ik in plaats van nothing een waarde aan m_ticket toewijs, gaat het updaten prima. Wat kan hier de oorzaak van zijn?

Verwijderd

Topicstarter
Visual Basic .NET:
1
2
3
4
5
        If m_ticket.HasValue Then
            TicketParameter.Value = m_ticket
        Else
            TicketParameter.Value = System.Convert.DBNull
        End If


van: http://blogs.msdn.com/vbteam/archive/2004/05/28/143813.aspx. Dit werkt in ieder geval wel. Is er echter geen manier om dit efficienter te doen? (i.e. minder regels code / korter / overzichtelijker) Met de 16 parameters die ik wil toevoegen word het een erg grote lap code.

  • WasBak
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op zondag 29 april 2007 @ 14:32:
Visual Basic .NET:
1
2
3
4
5
        If m_ticket.HasValue Then
            TicketParameter.Value = m_ticket
        Else
            TicketParameter.Value = System.Convert.DBNull
        End If


van: http://blogs.msdn.com/vbteam/archive/2004/05/28/143813.aspx. Dit werkt in ieder geval wel. Is er echter geen manier om dit efficienter te doen? (i.e. minder regels code / korter / overzichtelijker) Met de 16 parameters die ik wil toevoegen word het een erg grote lap code.
In plaats van nullable columns not nullable maken en daar een default waarde aangeven in SQL?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je kan bij het definieren van je parameters al een DBNull.Value aan je nullable params geven, en daarna dan checken of er daadwerkeljk een waarde moet aan toegekend worden of niet. 't principe blijft weliswaar hetzelfde.
code:
1
2
command.Parameters.Add ("@bliep", SqlDbType.Int).Value = DBNull.Value;
if( m_ticket.HasValue ) command.Parameters["@bliep"].Value = m_ticket;

https://fgheysels.github.io/


Verwijderd

parameters zijn beter, maar het antwoord op je vraag: maak er string van die integer en date

m_ticket.tostring()
String.format("{0:yyyyMMdd HH:mm:ss}", m_ticketdate)

als je de single quotes eruit haalt of dubbelt is er toch geen gevaar voor sql-injection?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Waarom zo moeilijk doen, en zelf altijd op quotes gaan checken als er iets veel beters bestaat , dat veel meer voordelen biedt.

https://fgheysels.github.io/


Verwijderd

gewoonte ! ik weet dat je met parameters kunt werken, maar aangezien ik het niet deed in PHP/ASP en VB6 doe ik het ook maar niet in VB.NET. Maar misschien is het nu de tijd om die oude gewoonte af te leren.

Verwijderd

Topicstarter
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Dim TableName As String = "DeNaamvandeTabel"

        Dim CreateTable As String = _
        "CREATE TABLE @p_TableName (" & _
        "TransactionID int IDENTITY(1,1) NOT NULL, " & _
        "Ticket int NOT NULL" & ")"

        Dim command As New SqlCommand(CreateTable, con)
        command.Parameters.Add("@p_TableName", SqlDbType.Text).Value = TableName

        Try
            con.Open()
            command.ExecuteNonQuery()
        Catch ex As InvalidOperationException
            Console.WriteLine("Database error: The connection is already open/no datasource is specified.")
        Catch ex As SqlException
            Console.WriteLine("Database error: A connection-level error occurred (ExecuteNonQuery).")
        Finally
            con.Close()
        End Try


Ik snap niet waarom ik in dit geval geen parameter kan toevoegen. Dit voorbeeld is in principe hetzelfde als eerder in dit topic.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Omdat het een CREATE TABLE statement is.
Parameters werken blijkbaar alleen in select, update, insert , delete statements. Ook voor een 'IN' clausule kan je bv geen parameters gebruiken.
In die gevallen moet je dan gewoon met string concatenation werken.

https://fgheysels.github.io/


Verwijderd

whoami schreef op zondag 13 mei 2007 @ 22:05:
Omdat het een CREATE TABLE statement is.
Parameters werken blijkbaar alleen in select, update, insert , delete statements. Ook voor een 'IN' clausule kan je bv geen parameters gebruiken.
In die gevallen moet je dan gewoon met string concatenation werken.
Weet je dat van die IN clausule heel zeker?

Oh ja ff vergeten, een IN wil je over meerdere parameters kunnen doen en met statische queries gaat dat niet. Dan zou je een hoop meer dynamisch moeten opbouwen om dit te doen.

[ Voor 18% gewijzigd door Verwijderd op 13-05-2007 22:21 ]

Pagina: 1