#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 : Похоже, что требуется достаточное объяснение / демонстрация кода, чтобы оправдать новый вопрос. Я рекомендую вам сделать это, и я постараюсь помочь в этом.