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)
我有一个带有条目的 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)