System:: Преобразование объекта в int или double в C / CLI

#sql #c -cli #ole

#sql #c -cli #ole

Вопрос:

Я беру некоторую информацию из базы данных и хочу использовать ее в вычислениях. Но из-за того, что я написал, я не могу преобразовать его в number. Я получаю System::Object^ . вот часть кода:

 OleDbConnection ^ cnNwind = gcnew OleDbConnection();

cnNwind-> ConnectionString = 
L"Provider = Microsoft.Jet.OLEDB.4.0;" 
L"Data Source = C:\temp\A.mdb";

try
{
    // Open the database
    cnNwind->Open();
    Console::WriteLine(L"Connected to database successfully!");

    // Count the customers
    OleDbCommand ^ cmProducts = gcnew OleDbCommand();
    cmProducts->CommandText = L"SELECT ID FROM Table1";
    cmProducts->CommandType = CommandType::Text;
    cmProducts->Connection = cnNwind;

    // Print the result
    Object ^ numberOfProducts = cmProducts->ExecuteScalar();
    Console::Write(L"Number of products: ");
    Console::WriteLine(numberOfProducts);
}
catch (OleDbException ^ pe)
{
    Console::Write(L"Error occurred: ");
    Console::WriteLine(pe->Message);
}
// Close the connection
if (cnNwind->State != ConnectionState::Closed)
{
    cnNwind->Close();
}

Console::WriteLine(L"The database connection is closed...");
  

Я хочу использовать numberOfProducts как цифру. Я имею в виду тип double или integer . Как я могу это преобразовать?

Комментарии:

1. Для меня похоже на c # (а не на c ) Вы получите лучшие ответы, если измените теги и правильно отформатируете примеры кода (используйте символ {} выше, где вы вводите вопрос).

2. @Tom, это C / CLI. Вы правы, что это совсем другой язык, чем C .

3. Ребята, я не совсем уверен, что я делаю, потому что это просто был единственный рабочий вариант подключения к базе данных. Я не смог сделать это с помощью простого c . Можете ли вы сказать мне, как это можно сделать? И в любом случае, как я могу использовать этот numberOfProducts дальше?

Ответ №1:

Просто используйте safe_cast для приведения Object^ к соответствующему типу. Это подробно описано на этой странице: Как: Использовать safe_cast в C / CLI

 Object^ numberOfProductsObj = cmProducts->ExecuteScalar();
// IIF the underlying type is System::Int32
int numberOfProducts = safe_cast<int>(numberOfProductsObj);
// or, IIF the underlying type is System::Double
double numberOfProducts = safe_cast<double>(numberOfProductsObj);
  

Поскольку может быть только один базовый тип (и я не знаю, что это в вашем случае), только один из них будет работать — другой выдаст исключение. Суть в том, что ваш первый шаг — определить фактический базовый тип (предположительно double , float или int ).

Комментарии:

1. Кстати, если я хочу извлечь символ [20] из базы данных, могу ли я использовать тот же метод или мне следует внести некоторые изменения?

2. @KAGDGAP : char[20] будет маршализован как System::String^ , поэтому проще всего было бы использовать System::Object::ToString() : Object^ someStringObj = /*...*/; String^ someString = someStringObj->ToString();

3. Послушайте, у меня есть одна серьезная проблема. Мой запрос может возвращать некоторую таблицу, в которой может быть более одной строки, и мне нужно взять каждую ячейку в другой переменной (может быть в списке или массиве). Можете ли вы помочь мне написать это? или описать шаги?

4. @KAGDGAP : Похоже, что требуется достаточное объяснение / демонстрация кода, чтобы оправдать новый вопрос. Я рекомендую вам сделать это, и я постараюсь помочь в этом.