Autor |
Beitrag |
m.keller
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 14:48
Hallo,
Ich habe folgendes Problem:
Ich nutze ein SQL-reader um Daten aus eine MSSQL DB zur verfühgung zu stellen.
Mit diesem reader lese ich die Spalten der Tabelle aus.
Nun gibt es eine Spalte den type varbinary.
Wenn ich diesen Wert einer Variable übergebe und diese ausgeben lasse bekomme ich nur als wert System.Byte[].
Leider bekomme ich diesen nicht in ein Unicode Konvertiert.
Ich fände toll wenn mir dabei jemand helfen kann.
vielen dank
Moderiert von Th69: Titel geändert.
Moderiert von Th69: C#-Tags hinzugefügtModeriert von Christian S.: Topic aus WinForms verschoben am Di 25.02.2014 um 08:56
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 16.01.14 15:04
Encoding hat eine GetString Methode wo du dein Byte Array reinschieben kannst um einen String zu bekommen. Du mußt nur das richtige Encoding wählen. In erster Näherung vermutlich utf8.
Dann also
C#-Quelltext 1:
| var meinLieberString = Encoding.UTF8.GetString(meinLiebesLiebesByteArray); |
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 15:09
Danke,
das habe ich schon versucht.
Da meckert mich nur VS an...
C#-Quelltext 1: 2:
| Fehler 1 Die beste Übereinstimmung für die überladene System.Text.Encoding.GetString(byte[])-Methode hat einige ungültige Argumente. Fehler 2 1-Argument: kann nicht von "object" in "byte[]" konvertiert werden. |
hier am besten noch ein ausschnitt vom Script
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for (int i = 0; i < resultUploadKeys.Length; i++) {
print_log(Encoding.UTF8.GetString(reader[resultUploadKeys[i]])); } |
alle anderen werte werden korrekt ausgelesen.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 16.01.14 15:25
Du bekommst von Reader ja auch kein Objekt vom Typ byte[], sondern vom Typ object und das musst du erst als byte[] casten:
C#-Quelltext 1:
| Encoding.UTF8.GetString((byte[])reader[resultUploadKeys[i]]); |
Aber warum eigentlich als string? Ich würde den Typ dazu nutzen, Daten zu speichern, die du auch als byte-Array hast, wie z.B. den Inhalt einer Datei. Da bietet sich meiner Meinung nach an, das byte-Array so in die Datenbank zu legen und auch so wieder in einen Stream ein zu lesen.
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 15:35
Danke,
casten habe ich bis jetzt noch nie was von gehört aber gut zu wissen
Es ist ein etwas älteres System und nur mit varbinary ist es möglich alle Daten ein zu pflegen.
Irgendwie bekomme ich daraus jetzt nur keine Werte.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 16.01.14 15:52
Zitat: | Es ist ein etwas älteres System und nur mit varbinary ist es möglich alle Daten ein zu pflegen. |
Das ist aber auch das einzige was man mit binär Typen kann  Jegliches Features alles join, durchsuchen etc. wofür sich eine relationale Datenbank explizit anbietet ist damit ausgeschlossen. Man kann sie nur reinwerfen und wieder rausholen. Da du scheinbar in deinem Code über Spalten iterierst und damit alle oder fast alle Spalten varbinary sind un dnicht nur eine hört sich das doch ausgesprochen kontraproduktiv an. Insbesondere wenn das da drin nicht ursprünglich binäre Daten sind sondern einfach nur Text.
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 15:57
Es ist nur eine Ergebnisspalten von diesem Type.
Der Rest hat andere Typen.
In dieser Spalte sind nur Messwerte abgelegt.
Ich bin auch nicht glücklich damit, aber wie heist es so schön "kunde ist König".
Jetzt ist System.Byte weg, allerdings bekomme ich auch keine Werte aus der Spalte.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 16.01.14 16:32
Naja, für Messwerte würde sich doch eigentlich eine weitere Tabelle anbieten?
Da stehen dann wichtige Daten der Messung drin und die Messwerte selber, dazu noch die Number des Auftrages. Zumindest so in der Art.
Was meinst du damit:
Zitat: | Jetzt ist System.Byte weg |
Und wenn du keine Werte bekommst, ist der Fehler irgendwo anders. Ein schöner Fehler ist ja, dass man testweise Daten in VisualStudio über den ServerExplorer bei der Datenbank direkt einträgt und dann beim Auslesen zur Laufzeit keine zurück bekommt. Das kann passieren, wenn man beim Entwickeln mit einer Datebank arbeitet, die irgendwo liegt, die Master-Datenbank oder so, während die SOftware aber eine ganz andere Datenbank verwendet, die als Kopie der Master-Datenbank erstellt wurde.
Das ist mir zumindest mal bei Sql Server Compact passiert, da passiert das einfach, ist ja nur eine Datei ^^
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 16:42
Naja, wie am Anfang ich beschrieben hatte das ich den Variablen Typ ausgegeben bekomme.
C#-Quelltext
Das wird nun nicht mehr ausgegeben.
Die werte habe ich in der MSSQL Datenbank mir generieren lassen.
Einfach fortlaufende Nummern.
Die Datenbank ist auf dem System Test weise Installiert.
Vielleicht über sehe ich gerade auch ne Kleinigkeit und sollte mal Feierabend machen.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 16.01.14 16:50
Es reicht auch schon ein Kaffee oder eine Runde an der frischen Luft ^^
Du meinst, vor dem Cast hast du ein byte[] bekommen und nach dem Cast zum byte[] nicht mehr?
Das klingt irgendwie seltsam
Sicher, dass du einfach nur den Typ, den die Daten hinter object tatsächlich haben (also byte[]), in Klammern davor geschrieben hast?
C#-Quelltext 1: 2: 3: 4: 5:
| for (int i = 0; i < resultUploadKeys.Length; i++) { var binaryData = (byte[])reader[resultUploadKeys[i]]; print_log(Encoding.UTF8.GetString(binaryData)); } |
Für diesen Beitrag haben gedankt: m.keller
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 16:57
Ich habe es so:
C#-Quelltext 1: 2: 3:
| resultUploadValues[i] = (byte[]) reader[resultUploadKeys[i]]; print_log("convertiert" + " " + resultUploadKeys[i] + " " + Encoding.UTF8.GetString(resultUploadValues[i])); |
resultUploadValues[i] ist vom Typ string
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.01.14 17:27
Hallo,
also die Grundlagen von Datentypen und Datentypen-Konvertierungen ('casten') sollte man schon beherrschen, wenn man sich mit komplexeren Sachen wie Datenbanken beschäftigt.
Du hast anscheinend die Hinweise von Ralf und Palladin007 nicht wirklich verstanden. Dein letzter Code kann ja nicht funktionieren, denn du kannst nun mal nicht direkt ein Objekt vom Typ byte[] einem String zuweisen. Dafür gibt es die von Ralf angesprochene Methode und diese mußt du dann hier einsetzen (und nicht erst bei der Ausgabe eine Zeile später).
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 16.01.14 17:31
Das habe ich ja aber es bringt leider nicht das gewünschte Ergebniss --> Wert aus der Datenbank
ich hatte anscheinend noch die Falschen Zeilen in der Zwischenablage
Dies habe ich probiert.
C#-Quelltext 1: 2:
| resultUploadValues[i] = Encoding.UTF8.GetString((byte[])reader[resultUploadKeys[i]]); print_log("convertiert" + " " + resultUploadKeys[i] + " " + resultUploadValues[i]); |
und in der Datenbank sind ganz sicher werte vorhanden, wie z.B. 0x00000001
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 16.01.14 18:05
Du sagst, vorher sind ganz sicher die richtigen Daten vorhanden. Setze dort doch mal einen Breakpoint und schaue, ob die da sind und wann sie dann nicht meher wie gewollt vorhanden sind. Der Code, der daran schuld ist, dass sie "verschwinden" dürfte dir Aufschluss darüber geben, wo sie geblieben sind. Ich kann allein in der Konvertierung zumindest keinen Fehler erkennen.
Und wenn das Problem in der Schleife liegt, wo du dann den String vom Array haben willst, dann lege mal die einzelnen Objekte in einzelne Variablen und schau dir so dann den Inhalt an, während er Punkt für Punkt vom Objekt aus dem DataReader zum String verarbeitet wird.
Für diesen Beitrag haben gedankt: m.keller
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.01.14 20:14
Hallo nochmal,
du schreibst
m.keller hat folgendes geschrieben: | und in der Datenbank sind ganz sicher werte vorhanden, wie z.B. 0x00000001 |
Dies ist aber dann ganz sicher kein (ASCII- bzw. Unicode)-String. Du mußt schon genau wissen, in welchem Format die Messwerte abgelegt sind. Evtl. als reine Binärdaten, dann kannst du sie mit der Klasse [url]BinaryReader[/url] auslesen, z.B.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| using(MemoryStream stream = new MemoryStream(bytes)) using(BinaryReader reader = new BinaryReader(stream)) { while(stream.Position < stream.Length) { int x = reader.ReadInt32(); } } |
(alternativ als long, float, double mit den zugehörigen Methoden auslesen).
Für diesen Beitrag haben gedankt: m.keller
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Mo 24.02.14 11:54
Hallo,
das Problem ist leider doch noch nicht gelöst
jetzt in der Test-fase kommen die Probleme.
Leider war mir bis zu heute nicht bekannt das die Varbinary daten aus der Datenbank 32 bit groß sein.
Nun muss ich in irgend einer art und weise 32 bit Varbinary in einen utf8 String konvertieren.
Da aber die vorige ideen von euch nur auf 16 bit funktionieren habe ich nun ein große Problem.
Wie bekomme ich die Varbinary Daten mit 32 bit interpretiert?
Und wie bekomme ich float werte eben so konvertiert?
Entweder stehe ich gerade echt am schlauch oder bin zu dumm dafür.
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 24.02.14 12:08
Zitat: | Nun muss ich in irgend einer art und weise 32 bit Varbinary in einen utf8 String konvertieren. |
Varbinary hat kein Format. Wenn irgendwas was wir vorher geraten haben funktioniert hat war das Zufall.
Wie die Daten zu interpretieren sind hängt davon ab wie sie reingeschrieben worden sind.
Also was(Integer, Float, Chars in welcher Bittigkeit und welcher Byte Reihenfolge) wurde wie in das Feld geschrieben?
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Mo 24.02.14 12:14
Zitat: | Also was(Integer, Float, Chars in welcher Bittigkeit und welcher Byte Reihenfolge) wurde wie in das Feld geschrieben? |
Ich weis in welchem Feld ein Welcher Typ steht.
Es gibt Strings und Float Werte die alle in diesem Varbinary Feld stehten.
Alle sind in 32 bit längen aus zu lesen!
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 24.02.14 12:21
Wenn unterschiedliche Typen in dem Feld stehen wodurch weißt du wann welcher Typ tatsächlich gemeint ist? Den Typ kann man denn Bytes nicht ansehen. Genausowenig die korrekte Reihenfolge der Bytes.
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Mo 24.02.14 12:26
es existiert ein weiteres Feld in der Datenbank wo mir der Type übermittelt wird.
Somit kann ich davon ausgehen, dass es entweder um ein String oder floate geht.
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|