OracleCommand参数Varchar2悖论;-)

本文关键字:悖论 参数 Varchar2 OracleCommand | 更新日期: 2023-09-27 17:59:55

我有一个OracleDB,其中包含以下条目:

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

身份证号码(8,0)
名字(CHAR(30字节))
次要名称CHAR(30字节)

现在我有了这几行代码来选择这些条目:

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                          ";

我收到这些条目这是配偶的方式吗,我必须填写参数?但是为什么直接的方式不需要它呢?

那么,获取Column大小并填充参数值的正确方法是什么?还是我做错了?

感谢:-)

OracleCommand参数Varchar2悖论;-)

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

正如这里所解释的,Varchar2和char之间的主要区别是什么,CHAR(#)类型,用于存储固定长度的字符串。在代码中,您将参数强制转换为varchar2类型。

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

尝试将其强制转换为OracleDbType.Char(或使列成为Varchar2)