Почему строки ExecuteReader() заполняются пробелами?
У меня есть два запроса:
Q1: select name from presidents where country = 'USA'
Q2: select 'Obama' as name from presidents where country = 'USA'
При использовании System.Data.Odbc.OdbcCommandExecuteReader
возвращаемый DbDataReader
содержит 'Obama'
в случае Q1 и 'Obama '
в случае Q2.
Почему строка заполняется конечными пробелами в случае Q2 и что является средством?
В некоторых случаях обрезка является уродливой и даже неправильной. Я использую .Net Framework 3.5.
Вот тестовый код
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = (OdbcConnection)DatabaseContext.Connection;
cmd.CommandText = "select 'Obama' from dual";
cmd.CommandType = CommandType.Text;
OdbcDataReader r = cmd.ExecuteReader();
if (r.Read())
{
String s = r.GetString(0);
// s now contains "Obama "
// with trailing spaces
}
Ответы
Ответ 1
ExecuteReader
возвращает данные из базового источника данных без каких-либо дополнений.
Это ваш базовый источник данных, в данном случае Oracle, который возвращает конечные пробелы.
Google для "оконных пространств оракула", чтобы понять, почему это так, и, в частности, понять разницу между типами данных CHAR и VARCHAR в Oracle.
Тем временем вы можете либо удалить конечные пробелы в SQL-запросе:
SELECT RTRIM(Col1) FROM ...
Или удалите их в клиенте:
string s = r.GetString(0).TrimEnd()