OracleCommand参数Varchar2 paradoxon ;-)

时间:2016-08-03 15:20:47

标签: c# oracle parameters varchar2

我有一个带有条目的OracleDB:

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

ID号码(8,0)
名字(CHAR(30 BYTE))
CHAR姓名(30 BYTE)

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

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大小并填充参数值的正确方法是什么? 或者我做错了吗?

谢谢: - )

1 个答案:

答案 0 :(得分:1)

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

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

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

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