Announcement

Collapse
No announcement yet.

DataAdapter.Update funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataAdapter.Update funktioniert nicht

    Hallo,
    in Visual Studio habe ich ein DataSet erzeugt und es mit meiner Datenquelle verbunden. Es funktionert alles: Anzeige der Daten in den TextBoxen des Formulars, Datennavigation usw. Mit dem DataAdapter.Update sollen Änderungen des DataSets in meiner Datenquelle übernommen werden.
    Dies funktioniert aber nur, wenn ich Datensätze lösche oder verändere. Sobald ich einen Datensatz hinzufüge, bekomme ich beim Update folgende Fehlermeldung:

    Zeichenfolgen- oder Binärdaten werden abgeschnitten.
    Die Anweisung wurde beendet.


    Woran kann das liegen? Könnte es womöglich etwas damit zu tun haben, dass ich den CommandBuilder zur Generierung der Befehle verwendet habe? Wenn ja, wie kann man die Commands manuell programmieren?

    Gruß, Stefan

    _________________________________________

    ' --- Dataset erzeugen
    _ds = New DataSet()

    ' --- SQL-Abfrage
    _SQL = "SELECT ... FROM ... WHERE ..."

    ' --- ConnectionString festlegen
    _conn = New SqlConnection("Data Source = ...)

    ' --- DataAdapter
    _da = New SqlDataAdapter(_SQL, _conn)

    _cmd = New SqlCommand(_SQL)
    _cmd.Connection = _conn

    ' --- Tabelle lesen
    _da.FillSchema(_ds, SchemaType.Source)
    _da.Fill(_ds, "StmSachNr")
    _____________________________________________

    ' --- CommandBuilder
    Dim CommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(_da)
    CommandBuilder.GetInsertCommand()
    CommandBuilder.GetDeleteCommand()
    CommandBuilder.GetUpdateCommand()
    ______________________________________________

    Private Sub frmStmSachNr_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    Me.Validate()
    Me.CurrencyManager.EndCurrentEdit()
    Me._da.Update(_ds, "StmSachNr")
    End Sub

  • #2
    Hallo,

    die Schreibweise von VB kenne ich nicht; deshalb bitte nachdenken und umsetzen.

    CommandBuilder.GetInsertCommand() usw. sind Funktionen; der Rückgabewert ist an den DataAdapter zu übergeben:
    Code:
    _da.InsertCommand = CommandBuilder.GetInsertCommand()
    Genauso kann der Befehl auch manuell erzeugt und zugewiesen werden:
    Code:
    _cmd = New SqlCommand("Insert into ...")
    _cmd.Parameters.Add(was auch immer Du brauchst)
    _da.InsertCommand = _cmd
    Ob das Deine Probleme löst, ist mir nicht klar; aber dadurch könnte es zumindest etwas sauberer werden.

    Viel Erfolg! Jürgen

    Comment


    • #3
      Hallo Jürgen,

      danke für deine Antwort. Ich habe alles so ausprobiert wie du es mir beschrieben hast, aber die SqlException "Zeichenfolgen- oder Binärdaten werden abgeschnitten..." erscheint immer noch, wenn ich einen Datensatz hinzufüge und dann ein Update durchführen will.

      Hat jemand eine Idee, was der Grund dafür sein könnte?

      Das Update nach Ändern oder Löschen von Datensätzen funktioniert ja, deshalb bin ich auch ziemlich ratlos.


      Gruß, Stefan

      Comment


      • #4
        Hallo,

        ...dass ich den CommandBuilder zur Generierung der Befehle verwendet habe?
        diese Klasse gehört in den Giftschrank! Die einzige Daseinsberechtigung betrifft Anwendungen, die mit zur Entwicklungszeit völlig unbekannten Tabellenstrukturen umgehen müssen. Anstelle in der Entwicklungsumgebung einmalig die Anweisungen zu generieren, muss die Anwendung zur Laufzeit jedes Mal aufs Neue die Schemadaten aus der Datenbank auslesen, um die SQL-Anweisungen zu generieren. Der CommandBuilder oder auch die FillSchema-Methode des untypisierten DataSets ist daher auch mit der im Auto "angezogenen Handbremse" zu vergleichen ;-)

        Zeichenfolgen- oder Binärdaten werden abgeschnitten.
        Dieses Veto löst die Datenbank immer dann aus, wenn der Client bei einer Zeichenspalte (CHAR/VARCHAR/NVARCHAR) eine größere Zeichenlänge übergibt, als die Spalte in der Datenbanktabelle breit ist. Damit dieser "Unfall" nicht passieren kann, muss jeder Parameter (der Parameters-Sammlung) die maximale Breite synchron zur Tabellendeklaration in der Datenbank setzen. Wenn der visuelle Komfort von Visual Studio verwendet wird (... typisiertes DataSet bzw. TableAdapter...), übernimmt Visual Studio alle diese Aufgaben völlig transparent im Hintergrund. Der Entwickler muss niemals selbst die Anweisungen von Hand schreiben (es sei denn, er verzichtet aus irgend einem Grund auf den visuellen Komfort).

        Comment


        • #5
          Originally posted by Andreas Kosch View Post
          ... muss jeder Parameter (der Parameters-Sammlung) die maximale Breite synchron zur Tabellendeklaration in der Datenbank setzen.
          Hallo Andreas,

          wie mache ich das denn am besten? An welcher Stelle und wie lege ich die maximale Breite fest?

          Außerdem habe ich versucht, selbst einen InsertCommand zu erstellen. Ist das überhaupt richtig so und was fehlt daran noch?

          Gruß, Stefan

          ___________________________________

          Private Sub Insert()

          _cmd = New SqlCommand("INSERT INTO StmSachNr (sid, SysId, SachNr, Bezeichnung) VALUES (@sid, @SysId, @SachNr, @Bezeichnung)", _conn)

          _cmd.Parameters.Add("@sid", SqlDbType.Int, 4, "sid")
          _cmd.Parameters.Add("@SysId", SqlDbType.Int, 4, "SysId")
          _cmd.Parameters.Add("@SachNr", SqlDbType.VarChar, 30, "SachNr")
          _cmd.Parameters.Add("@Bezeichnung", SqlDbType.VarChar, 40, "Bezeichnung")

          _da.InsertCommand = _cmd
          End Sub
          ___________________________________

          Private Sub BtnSpeichern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSpeichern.Click
          Me.Validate()
          Me.cm.EndCurrentEdit()
          Insert()
          ... ...
          End Sub

          Comment


          • #6
            Hallo,

            ..selbst einen InsertCommand zu erstellen.
            welchen Sinn macht es, diesen Teil von Hand zu schreiben, wenn Visual Studio das alles im Hintergrund erledigen kann?


            An welcher Stelle und wie lege ich die maximale Breite fest?
            Die erste Stelle ist das Eingabefeld (wie zum Beispiel die TextBox) in der Benutzeroberfläche, damit der Anwender sofort ein visuelles Feedback erhält, wie viele Zeichen maximal als gültige Eingabe zulässig sind. Die zweite Stelle ist die Parameter-Instanz in der Parameters-Kollektion.

            Comment

            Working...
            X