2016-03-30 2 views
2

Meine FunktionCasting mysql Leser Zeichenfolge führen löst eine Ausnahme in C#

public Permission[] GetPermissionsForGroupID(string groupID) 
    { 
     MySqlCommand command = new MySqlCommand(); 
     command.Connection = connection; 
     command.CommandText = "SELECT `permissions`.`permissionName`, `groups_permissions`.`permissionValue` 
     FROM `db`.`groups_permissions`, `db`.`permissions` 
     WHERE `permissions`.`permissionID` = `groups_permissions`.`permissionID` 
     AND `groups_permissions`.`groupID` = '" + groupID + "'"; 
     MySqlDataReader reader = command.ExecuteReader(); 
     List<Permission> permissions = new List<Permission>(); 
     while (reader.Read()) 
     { 
      permissions.Add(new Permission((string)reader[0], (int)reader[1])); 
     } 
     reader.Close(); 
     return permissions.ToArray(); 
    } 

eine System.InvalidCastException bei

permissions.Add(new Permission((string)reader[0], (int)reader[1])); 
wirft

ich es verengt (string)reader[0] nach unten, wo ein varchar sollte in ein gegossen werden string.

reader[0] = permissions.permissionName = varchar 

Was könnte das Problem sein?

EDIT:

Der Wert des Lesers [0] ist eine Zeichenfolge "kick_user_power" und der Wert von reader[1] eine ganze Zahl "75".

EDIT 2:

Der Konstruktor von Permission

public Permission(string permissionName, int permissionPower) 
    { 
     PermissionName = permissionName; 
     PermissionPower = permissionPower; 
    } 

Und zur besseren Visualisierung werden die Werte von reader[0] und reader[1]: Reader-Values

+0

Was ist der Wert der Leser [0] verwendet werden soll, und, was das betrifft, der Leser [1]? –

+0

und der Konstruktor für die Permission-Klasse - wie sieht das aus? –

Antwort

3

Die Klasse dotnet SqlDataReader enthält Funktionen zum Abrufen von Spaltendaten.

Sie wollen wahrscheinlich

reader.GetString(0) 

und

reader.GetSqlInt32(1) 

verwenden, um Ihre Werte abrufen.

In der Tat für die besten Ergebnisse, die Sie

reader.IsDbNull(0)? "missing value" : reader.GetString(0) 
+0

Schöne Idee. Ich werde meinen Code definitiv umgestalten, um diesen Ansatz zu verwenden. Es hat vollkommen gut funktioniert. Vielen Dank! –

0

Könnte es sein, dass es nicht das ist In String umwandeln, das ist das Problem, aber die Besetzung zu int?
Versuchen

permissions.Add(new Permission(reader[0].ToString(), Convert.ToInt64(reader[1]))); 

Sowohl ToString() und Convert.ToInt64 sind ein bisschen weniger "sensibel".

+0

Nein. Es hat nicht funktioniert. Ich habe sichergestellt, dass es Reader [0] ist, indem ich seine Werte den Variablen separat zuweise. (Ich habe das in der Frage nicht gezeigt, aber erwähnt, indem ich sagte, dass ich es auf den Leser [0] verengte.) –

Verwandte Themen