2016-03-21 4 views
3

Ich stehe vor einem Problem, bei dem C# eine Ergebnisdaten aus einer MySQL Stored Procedure falsch zu interpretieren scheint.C# MySQL Fehlinterpretation des Feldtyps

Die Stored Procedure gibt 3 Int32 Spalten gefolgt von 4 Varchar/String Spalten ... oder zumindest sollte es.

Die Spalten 1-5 kehren in Ordnung zurück und auch die Spalte 7, aber aus irgendeinem Grund scheint Spalte 6 als Image/Byte [] Spalte interpretiert zu werden und ich habe keine Ahnung warum die Stored Procedure definitiv Varchar zurückgibt (255) Spalte für dieses Feld.

Ich bin noch nie auf dieses Problem gestoßen und umfangreiche googeln gibt nur unabhängige Probleme zurück. Jede Hilfe wäre willkommen.

Unten ist der C# -Code;

Ich habe keinen Zugriff auf den SP, also kann ich diesen Code nicht posten. Im Folgenden finden Sie jedoch ein Beispiel für einen Ergebnissatz. Ich vermute, es ist der hervorgehobene Wert, der das Problem verursacht, aber keine Ahnung.

|ID1|ID2|Flagged|Att|Operation|Value|Type| 
|---|---|-------|---|---------|-----|----| 
|740|100|1  | |=~  |NULL |User| 
|740|100|1  | |!*  |. |Item| 
|740|100|1  | |:=  |PPP |Item| 
|740|100|1  | |:=  |**base-qos-tp,bb-qos-sch-map,8m,bb-qos-cl-dscp,bb-qos-rw-1p,-24,-24**|Item| 
|740|100|1  | |:=  |8MOS |Item| 

UPDATE von Kommentaren

  • Der Anbieter ist Connector/NET 6.9.7
  • dt1 eine nicht typisierte Datatable ist.
  • Der Code der gespeicherten Prozedur ist nicht verfügbar. Der Typ der sechsten Spalte (Value) wurde von der DBA als varchar(255) verifiziert.
  • Das Angeben von charset = utf8 und das Behandeln von Blobs als utfs = yes in der Verbindungszeichenfolge hat das Problem leider auch nicht gelöst.
  • Es wird angenommen, Datenbankversion ist 5.1.41
+4

Code? Fehlermeldungen? – hagello

+0

Ja. und "Es sollte" - was ist mit dir sicherzustellen, dass es tut? Und dann posten Sie genug Code, um es zu reproduzieren. Hilfe? Stellen Sie jemanden kompetenter ein. Will mehr - bieten mehr Informationen. – TomTom

+0

Während es einen Fehler mit dem Treiber geben kann, den Sie verwenden (welcher? Connector/Net? Noch etwas?), Ist der wahrscheinlichste Grund ein Problem entweder im Code oder in der gespeicherten Prozedur. Veröffentlichen Sie den Code und die Nachrichten. So wie es ist, ist es unmöglich zu helfen, Sie erwähnen nicht einmal * was * zurückgegeben wird: eine DataTable? Ein DataReader? Eine NHibernate-Entität? –

Antwort

0

ich den Grund nicht für die Fehlinterpretation heißt Ursache gefunden zu haben. Ich habe jedoch eine geeignete Problemumgehung gefunden.

Kurz gesagt, diese Problemumgehung besteht darin, zuerst die Spalten der DataTable auszufüllen. Dann lesen Sie das Ergebnis Zeile für Zeile, anstatt das Ergebnis direkt in die DataTable zu laden. Dann deklariere ein Byte-Array (b) im folgenden Code und setze es auf null, setze es später auf das Ergebnis der relevanten Spalte (Wert) im folgenden Code. Dann, um die Standardcodierung (in meinem Fall) zu verwenden, um in eine Zeichenkette zu konvertieren, bevor schließlich eine Reihe zur Datentabelle hinzugefügt wird.

Vollständiger Code unten.

DataTable dt1 = new DataTable(); 

dt1.Columns.Add("ID1", typeof(Int32)); 
dt1.Columns.Add("ID2", typeof(Int32)); 
dt1.Columns.Add("Flagged", typeof(Boolean)); 
dt1.Columns.Add("Att", typeof(String)); 
dt1.Columns.Add("Operation", typeof(String)); 
dt1.Columns.Add("Value", typeof(String)); 
dt1.Columns.Add("Type", typeof(String)); 

MySqlDataReader reader = null; 

using (MySqlConnection connection = new MySqlConnection("connectionstring")) 
{ 
    connection.Open(); 

    try 
    { 

     using (MySqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandType = CommandType.StoredProcedure; 

      command.CommandText = "viewu"; 

      command.Parameters.AddWithValue("uname", "ausername"); 

      reader = command.ExecuteReader(CommandBehavior.SequentialAccess); 

      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        byte[] b = null; 

        int ID1 = reader.GetInt32(0); 
        int ID2 = reader.GetInt32(1); 
        bool Flagged = reader.GetBoolean(2); 
        string Att = reader.GetString(3); 
        string Operation = reader.GetString(4); 
        b = (byte[])reader.GetValue(5); 
        string Type = reader.GetString(6); 

        string Value = Encoding.Default.GetString(b); 

        dt1.Rows.Add(1ID, ID2, Flagged, Attribute, Op, Value, Type); 
       } 
      } 

      gridControl1.DataSource = dt1; 
     } 
    } 
} 

Hoffentlich hilft einige, die verloren etwas bekam, wie ich

tat