OracleCommand 参数 Varchar2 自相矛盾 ;-)

OracleCommand Parameter Varchar2 paradoxon ;-)

我有一个带有条目的 OracleDB:

1、测试、测试
2、测试、测试

ID NUMBER(8,0)
名字 (CHAR(30 BYTE))
别名 CHAR(30 BYTE)

现在我有这行代码到 select 这个条目:

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)
    );
}

这很好用,但如果我使用如下参数:

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)
    );
}

我什么都没得到!但是,如果我将 ParameterValue 设置为:

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

我得到了这个条目o.O 这是通常的方式,我必须填写参数吗?但为什么直接方式不需要它?

那么获取Column size和填充参数值的方法是正确的吗? 还是我做错了?

谢谢 :-)

我认为你的问题出在列类型上。

如此处所述What is the major difference between Varchar2 and char , CHAR(#) 类型用于存储固定长度的字符串。在您的代码中,您将参数转换为 varchar2 类型。

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

尝试将其转换为 OracleDbType.Char(或将列设为 Varchar2)