2016-08-03 14 views
0

i haben eine OracleDB mit Einträgen:OracleCommand Parameter Varchar2 paradoxon ;-)

1, Test, Test
2, Test, Test

ID-Nummer (8,0)
Vorname (CHAR (30 BYTE))
Secondname CHAR (30 Byte)

und ich habe jetzt diese Zeilen von Code, um diese Einträge zu wählen:

string query = @"SELECT ID,FIRSTNAME,LASTNAME FROM persdata 
       WHERE (FIRSTNAME = 'test')"; 
var command = new OracleCommand(query, dbConnection) 
       { CommandType = CommandType.Text, BindByName = true }; 

IDataReader reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    int someColumn = reader.GetInt32(reader.GetOrdinal("ID")); 
    string anotherColumn = reader.GetString(reader.GetOrdinal("VORNAME")); 
    string thirdColumn = reader.GetString(reader.GetOrdinal("NACHNAME")); 
    Console.WriteLine(
     String.Format("{0}: {1}, {2}", someColumn, anotherColumn, thirdColumn) 
    ); 
} 

Dies funktioniert gut, aber wenn ich Seine Parameter wie:

string query = @"SELECT ID,FIRSTNAME,LASTNAME FROM persdata 
       WHERE (FIRSTNAME = :param)"; 
var command = new OracleCommand(query, dbConnection) 
       { CommandType = CommandType.Text, BindByName = true }; 

command.Parameters.Add(":param", OracleDbType.Varchar2).Value = "test"; 

IDataReader reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    int someColumn = reader.GetInt32(reader.GetOrdinal("ID")); 
    string anotherColumn = reader.GetString(reader.GetOrdinal("FIRSTNAME")); 
    string thirdColumn = reader.GetString(reader.GetOrdinal("LASTNAME")); 
    Console.WriteLine(
     String.Format("{0}: {1}, {2}", someColumn, anotherColumn, thirdColumn) 
    ); 
} 

ich nicht alles bekommen! Aber wenn ich die Parametervalue wie gesetzt:

command.Parameters.Add(":param", OracleDbType.Varchar2).Value = "test       "; 

ich diese Einträge ò.ó Ist das der usal Art und Weise, dass ich die Parameter füllen müssen? Aber warum braucht der direkte Weg das nicht?

So ist der richtige Weg, um die Spaltengröße zu erhalten und den Parameterwert zu füllen? oder mache ich es falsch?

Danke :-)

Antwort

1

Ich denke, Ihr Problem, das es in der Spalte Typ ist.

Wie hier erklärt What is the major difference between Varchar2 and char , ist der CHAR (#) -Typ es bedeutet, feste Länge Zeichenfolgen zu speichern. In Ihrem Code wird der Parameter in einen varchar2-Typ umgewandelt.

command.Parameters.Add(":param", OracleDbType.Varchar2).Value = "test"; 

versuchen, es zu einer Stelle OracleDbType.Char werfen (oder die Spalte machen eine Varchar2)