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大小并填充参数值的正确方法是什么?还是我做错了?
感谢:-)
我认为问题出在列类型上。
正如这里所解释的,Varchar2和char之间的主要区别是什么,CHAR(#)类型,用于存储固定长度的字符串。在代码中,您将参数强制转换为varchar2类型。
command.Parameters.Add(":param", OracleDbType.Varchar2).Value = "test";
尝试将其强制转换为OracleDbType.Char
(或使列成为Varchar2)