На вашем месте я бы не стал использовать odbc.
Из своего опыта: odbc (если подключение идет не к источнику данных Microsoft) - вещь глючная, тормозная, не надежная.
В Ax2009 использовал Net для подключения к FB. Все летает! Кроме того гораздо больше возможностей по управлению транзакциями, метаданными и т.п.
И еще:
- этот код работает и на серверной и на клиентской части, нужно лишь установить NET драйвер FB
- Никаких заморочек с настройкой DSN
Вот пример :
X++:
static void Job34(Args _args)
{
FirebirdSql.Data.FirebirdClient.FbConnection connection;
FirebirdSql.Data.FirebirdClient.FbCommand command;
FirebirdSql.Data.FirebirdClient.FbDataReader dataReader;
str sql;
str connectionString;
InteropPermission dllPermission = new InteropPermission(InteropKind::ClrInterop);
Date netDate(UtcDateTime _utcDateTime)
{
return DateTimeUtil::date(_utcDateTime);
}
real netDouble(real _value)
{
return _value;
}
;
dllPermission.assert();
connectionString = strFmt("User=%1;Password=%2;DataSource=%3;Port=3050;Database=%4;Charset=WIN1251;Dialect=3;ServerTyp=0",
"UserLogin",
"UserPassword",
"ServerAddres",
"Filename");
connection = new FirebirdSql.Data.FirebirdClient.FbConnection(connectionString);
connection.Open();
if (connection.get_State() == System.Data.ConnectionState::Open)
{
sql = "select * from mytable";
command = new FirebirdSql.Data.FirebirdClient.FbCommand(sql, connection);
command.set_Transaction(connection.BeginTransaction(System.Data.IsolationLevel::ReadCommitted));
dataReader = command.ExecuteReader();
while (chi_NetBoolean(dataReader.Read()) == true)
{
// 0..3 - эно номер стобца в результате запроса, можно обратится и по имени слобца в принципе..
print netDate(dataReader.GetDateTime(0));
print dataReader.GetString(1);
print dataReader.GetInt32(2);
print netDouble(dataReader.GetDouble(3));
}
dataReader.Close();
connection.Close();
}
}