| 

.NET C# Java Javascript Exception

1
Ich habe ein Problem bei einer DataTable, die ich mit Werten befüllen möchte. Eine Spalte ist als Unique eingerichtet, um doppelte Werte zu vermeiden. Wenn ich nun zwei Werte haben, die einmal mit 'ß' und einmal mit 'ss' geschrieben werden und diese in die Tabelle schreiben möchte, dann bekomme ich eine ConstraintExeption mit dem Hinweis, der Wert sei schon vorhanden (wie im Beispiel: "Column 'key' is constrained to be unique. Value 'Weiss' is already present.").

Gleiches Problem habe ich mit der Groß-/Kleinschreibung. Unterscheidet sich bei einem Wort lediglich die Groß-Kleinschreibung, dann ist das für ihn offenbar auch der gleiche Wert.

Wie kann ich dieses Verhalten ändern?

using System.Data;
using System.Windows.Forms;

namespace UniqueKeyDataTable
{
public class Form2 : Form
{
private DataTable dataTable = new DataTable();
private DataGridView dataGridView;

public Form2()
{
dataGridView = new DataGridView();
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Name = "dataGridView";

Controls.Add(dataGridView);

DataColumn column = new DataColumn("key");
column.Unique = true;
column.DataType = typeof(string);
dataTable.Columns.Add(column);
dataGridView.DataSource = dataTable;

//Werte zur Tabelle hinzufügen
AddNewValue("Weiß");
AddNewValue("Weiss");

AddNewValue("SCHWARZ");
AddNewValue("schwarz");
}

private void AddNewValue(string value)
{
DataRow row = dataTable.NewRow();
row[0] = value;
//beim zweiten Versuch krachts hier mit einer ConstraintException
dataTable.Rows.Add(row);
}
}
}
News:
16.09.2009
Mayday21 21 3
3 Antworten
2
Wie wäre es mit eine verstecken Spalten als Key und von dem nimmst du den HashCode der Zeichenfolge die du als Key verwenden möchtest.

public class Form2 : Form {
private DataTable dataTable = new DataTable();
private DataGridView dataGridView;

public Form2() {
dataGridView = new DataGridView();
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Fill;
dataGridView.Name = "dataGridView";
dataGridView.Columns[0].Visible = false;

Controls.Add(dataGridView);

DataColumn column = new DataColumn("key");
column.Unique = true;
column.DataType = typeof(int);
dataTable.Columns.Add(column);
dataGridView.DataSource = dataTable;

//Werte zur Tabelle hinzufügen
AddNewValue("Weiß");
AddNewValue("Weiss");

AddNewValue("SCHWARZ");
AddNewValue("schwarz");
}

private void AddNewValue(string value) {
DataRow row = dataTable.NewRow();
row[0] = value.GetHashCode();
row[1] = value; //Falls du trotzdem den Key-Wert anzeigen möchtest

//beim zweiten Versuch krachts hier mit einer ConstraintException
dataTable.Rows.Add(row);
}
}


Sinngemäßt etwa so. Ich hab die Änderungen mal unterlegt. GetHashCode erzeugt eine eindeutige ID für jeden String wobei "Weiß"<>"Weiss"<>"weiß"<>"weiss" ist. Natürlich kannst du das Case-Sensitiv auch "deaktivieren" in dem du value.ToUpper().GetHashCode(); schreibst.
16.09.2009
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Das funktioniert praktisch tatsächlich und scheint mir vorerst der einzig brauchbare Weg zu sein.
Wirklich schön ist das aber eigentlich nicht. Ich speichere zusätzliche Informationen, die ich eigentlich gar nicht benötigen würde, nur weil das, was ich eigentlich möchte, nicht vernünftig unterstützt wird.

Dennoch danke für den Tipp!
Mayday21 21.09.2009
0
Wenn es nicht stört, dass alle String-Vergleiche in der Data Table case sensitive werden, sollte doch dieses helfen:

dataTable.CaseSensitive = true;
dataTable.Locale = CultureInfo.InvariantCulture


(Nicht in der Praxis ausprobiert)
17.09.2009
pjacobi 1,1k 2 7
Er suchte zwar caseINsensitive aber egal ;)
dataTable.CaseSensitive = false;
Wäre dann das richtige wenn es denn funktioniert.
Floyd 17.09.2009
@Floyd: Nee, seine Überschrift ist nur falsch bis missverständlich. Das Default-Verhalten von DataTable ist case insensitive und culture correct. Und er möchte genau das Gegenteil.
pjacobi 17.09.2009
Die Property CaseSensitive hatte ich eigentlich schon ausprobiert und dachte die würde nicht helfen. Tatsächlich beseitigt sie wenigstens das "SCHWARZ/schwarz" Problem.
Nichts desto trotz ist das Problem mit "Weiß/Weiss" damit nicht gelöst ...
Mayday21 21.09.2009
0
Wie wäre es mit statt des Datentype string binary (byte[]) zu verwenden?

MSDN
17.09.2009
BeachBlocker 617 3
Es tut mir leid, ich konnte leider nicht erfassen, was Du mir mitteilen wolltest.
Mayday21 21.09.2009
Wenn du statt column.DataType = typeof(string);
column.DataType = typeof(byte[]); verwendetest. Ist "WEIß"!="WEISS"!="weiss"
BeachBlocker 21.09.2009
Ich hab das mal probiert wie von Dir vorgeschlagen. Leider fliegt mir dann bei der Anzeige der Tabelle das Ding um die Ohren:
[quote]System.ArgumentExeption: Parameter is not valid.[/quote]
Mayday21 22.09.2009
Das Lästige an der 'Lösung' ist natürlich die Konvertierung zwischen String und byte[]! z.B.

System.Text.UTF8Encoding encoding =
new System.Text.UTF8Encoding();

byte[] bytes = encoding.GetBytes(str);

string s = encoding.GetString(bytes);
BeachBlocker 22.09.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH