vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
Leerzeichen in Primärschlüssel-Spalte 
Autor: XPI
Datum: 18.10.15 03:29

Hallo ich habe ein Problem mit der Primärschlüsseleinschränkung oder ist der .Net Framework selbst defekt?

Dim DT As New System.Data.DataTable
DT.CaseSensitive = True
DT.Columns.Add("Text1", GetType(System.String))
DT.Columns.Add("Text2", GetType(System.String))
DT.Constraints.Add("Primärschlüssel", DT.Columns(0), True)
DT.Rows.Add("Text1","Text2")
DT.Rows.Add(" Text1"," Text2")
DT.Rows.Add("Text1 ","Text2 ")
Warum wird eine Primärschlüsselverletzung gemeldet?
Wie kann ich dennoch mit allen 3 Datenzeilen arbeiten?
Ich danke Euch im Voraus!

Beitrag wurde zuletzt am 18.10.15 um 03:30:21 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Leerzeichen in Primärschlüssel-Spalte 
Autor: Manfred X
Datum: 18.10.15 06:05

Hallo!

http://stackoverflow.com/questions/13489292/uniqueconstraint-on-dataset-fails-when-values-contain-space

Werte in einer Schlüsselspalte müssen eindeutig sein.
Beim Aufbau eines UniqueConstraint werden angehängte Leerzeichen ignoriert.
(Die erste und die dritte Zeile in der Spalte "Text1" enthalten "aus Sicht
des Constraint" den gleichen Wert. Du benötigst deshalb als Primärschlüssel
eine zusätzliche Spalte.)

Angehängte Leerzeichen werden auch bei der Auswertung von FilterExpressions
nicht beachtet.
Dim dtrows1() As DataRow = DT.Select("Text1 = 'Text1      '")
Dim dtrows2() As DataRow = DT.Select("Text1 = 'Text1'")
Diese Filter liefern - bezogen auf Dein Datenbeispiel - jeweils zwei Zeilen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Leerzeichen in Primärschlüssel-Spalte 
Autor: XPI
Datum: 20.10.15 14:49

Ich habe es nun mal selbst gelöst...
Option Strict On
Option Explicit On
Option Infer Off
Option Compare Text
 
Public Class Form1
    Dim DT As New System.Data.DataTable
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
      Handles MyBase.Load
        DT.CaseSensitive = True
        DT.Columns.Add("Text1", GetType(System.String))
        DT.Columns.Add("Text2", GetType(System.String))
        DT.Columns.Add("PKText", GetType(System.String))
        DT.Columns.Add("PKSpacesLeft", GetType(System.Int32))
        DT.Columns.Add("PKSpacesRight", GetType(System.Int32))
        DT.Constraints.Add("PK", {DT.Columns(2), DT.Columns(3), DT.Columns(4)}, _
          True)
 
        Dim DGV As New DataGridView
        DGV.Dock = DockStyle.Fill
        DGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        Me.Controls.Add(DGV)
        DGV.DataSource = DT
        DGV.Columns(2).Visible = False
        DGV.Columns(3).Visible = False
        DGV.Columns(4).Visible = False
 
        AddRow(DT, "Text1", "Text2") ' OK
        AddRow(DT, " Text1", " Text2") ' OK
        AddRow(DT, "Text1 ", "Text2 ") ' OK
        AddRow(DT, "Text1 ", "Text2 ") ' ErrMsg - duplicates!
    End Sub
    Private Sub AddRow(Table As DataTable, Text1 As String, Text2 As String)
        If Not Text1 = String.Empty Then
            Dim TT As String = Trim(Text1) ' trimmed text
            Dim SL As Integer = Text1.IndexOf(TT) ' spaces left
            Dim SR As Integer = Text1.Length - SL - TT.Length ' spaces right
            Try
                DT.Rows.Add(Text1, Text2, TT, SL, SR)
            Catch ex As System.Data.ConstraintException
                If DirectCast(ex.TargetSite, System.Reflection.MethodInfo).Name _
                  = "CheckConstraint" Then
                    MsgBox(ex.Message, MsgBoxStyle.Exclamation)
                End If
            End Try
        Else
            MsgBox("Text1 is empty!", MsgBoxStyle.Critical) ' Write log, dont 
            ' show Msg
        End If
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel